![](/img/trans.png)
[英]RecyclerView Adapter onBindViewHolder updates on second call via notifyItemChanged
[英]In RecyclerView.Adapter, notifyItemChanged doesn't always call onBindViewHolder
我正在处理一个相当烦人的错误,其中多次(相同)调用 notifyItemChanged() 有时只会触发 onBindViewHolder()。 我像这样调用notifyItemChanged:
public void updateData(Data stuff) {
// Update data.
int index = findIndexOfChangedItem(stuff);
// Using or adding notifyDataSetChanged() doesn't help.
notifyItemChanged(index);
}
而 onBindViewHolder 非常简单。
@Override
public void onBindViewHolder(MyItemViewHolder holder, int position) {
Log.d(TAG, "onBindViewHolder called for position " + position);
holder.setData(myList.get(position));
}
我观察到的问题是,当多次调用 updateData() 时(有时很频繁,在一秒钟内多次调用),一些更新会被丢弃。 但它确实经历了一半的时间,所以我知道基本实现有些工作。
我已经查看了所有显而易见的事情,例如确保索引正确并且实际上调用了 notifyItemChanged()。 另外,有趣的是,如果我添加自己的自定义观察者:
private RecyclerView.AdapterDataObserver obs = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
Log.d(TAG, "Observed state change in custom observer.");
super.onChanged();
}
};
我看到自定义观察者每次都被触发!
有什么理由为什么 RecyclerView.Adapter 的 onBindViewHolder 有时会被跳过,有没有办法绕过它?
编辑
我想知道这是否是由于androidx.recyclerview.widget.AdapterHelper
的onItemRangeChanged
仅在只有一件事要更新时才返回true
:
/**
* @return True if updates should be processed.
*/
boolean onItemRangeChanged(int positionStart, int itemCount, Object payload) {
if (itemCount < 1) {
return false;
}
mPendingUpdates.add(obtainUpdateOp(UpdateOp.UPDATE, positionStart, itemCount, payload));
mExistingUpdateTypes |= UpdateOp.UPDATE;
return mPendingUpdates.size() == 1;
}
然后,如果我在一个已经挂起的情况下添加更新,这将返回false
并且我的更新被删除。
我遇到了同样的问题,发现在notifyItemChanged
之后发生的onBindViewHolder
,但在绑定视图有机会实际附加到onViewAttachedToWindow
被删除。 数据的 IMO 失效不应该取决于视图状态 - 它是另一个(表示)层,所以它很可能是一个错误。
我在这里填写了一个错误: https : //issuetracker.google.com/issues/170125522
我现在使用的解决方法 - 只需跟踪您调用 notifyItemChanged 的视图,并检查onViewAttachedToWindow
如果onBindViewHolder
被调用。 如果不是,则notifyItemChanged
那里调用notifyItemChanged
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.