簡體   English   中英

在 RecyclerView.Adapter 中,notifyItemChanged 並不總是調用 onBindViewHolder

[英]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.AdapterHelperonItemRangeChanged僅在只有一件事要更新時才返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM