RecyclerView使⽤databinding出现数据闪烁问题
When something takes longer than expected, write it down.
问题产⽣:
最近做项⽬遇到RecyclerView使⽤databinding时,出现数据闪烁,⽼⼤说,这问题不解决就不要⽤databinding。。。
闪烁图效果如下,点击Refresh,数据闪了⼀次:
明明数据没变,但数据却刷了⼀遍。
代码如下:
class TestDBAdapter extends RecyclerView.Adapter<TestDBViewHolder> {
private List<TestData> list;
public TestDBAdapter(List<TestData> list) {
this.list = list;
馆子
}
@Override
public TestDBViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemTestDbRecyclerViewBinding binding = DataBindingUtil.inflate(LayoutInflater.Context()), R.layout.item_test_db_recycler_view, parent, fal);
return new TestDBViewHolder(binding);
}
@Override
public void onBindViewHolder(TestDBViewHolder holder, int position) {
吃石榴的好处与功效
holder.binding.(position));
// utePendingBindings();
什么汤下奶
}
@Override
钮祜禄氏
public int getItemCount() {
return list.size();
}
}
class TestDBViewHolder extends RecyclerView.ViewHolder {
public ItemTestDbRecyclerViewBinding binding;
public TestDBViewHolder(ItemTestDbRecyclerViewBinding binding) {
既然是什么意思Root());
this.binding = binding;
}
public TestDBViewHolder(View itemView) {
super(itemView);
}
}沙格列汀>唇焦口燥呼不得
}
问题追踪:
从图中可以看到item从浙江-->⼴东-->浙江,这个简单,因为recycler view会重⽤item,刷新时,第⼀个元素使⽤了第四个元素的ViewHolder。
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if (holder instanceof TaskItemViewHolder) {
final TaskItemViewHolder taskItemViewHolder = (TaskItemViewHolder) holder;
LogUtils.d("before: "+Binding().getData());//打印bind前holder中的数据
taskItemViewHolder.(position), position);
LogUtils.d("after: "+(position)+" position:"+position);//打印当前item的数据
}
}
打印结果:
before: ⼴东
after: 浙江
数据是肯定变了,难道数据闪烁是正常的,那为什么不⽤databinding时,没有出现数据闪烁现象?有⼈说全局刷新时layout重置。。。/**
* Evaluates the pending bindings, updating any Views that have expressions bound to
* modified variables. This <b>must</b> be run on the UI thread.
*/
bindData后⽴即刷新!
难道要⽴刻刷新?还没有搞清楚。。。
问题解决:
@Override
public void onBindViewHolder(TestDBViewHolder holder, int position) {
holder.binding.(position));
utePendingBindings();//加⼀⾏,问题解决
}
遗留问题:
1. RecyclerView notifyDataChanged时,明明item的数据变化了,但为什么没有闪烁呢?
2. executePendingBindings语句到底是什么⽤?调与不调有什么区别?东莞英语