[英]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.