繁体   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