如何取消适配器通知?

时间:2017-12-21 14:56:18

标签: android recycler-adapter

Recyclerview适配器有各种通知方法

notifyItemChanged(int)
notifyItemInserted(int)
notifyItemRemoved(int)
notifyItemRangeChanged(int, int)
notifyItemRangeInserted(int, int)
notifyItemRangeRemoved(int, int)

他们将事件添加到队列中,允许平滑动画,但如果在上一个事件完成之前发出反映数据大小变化的新通知,则抛出异常

java.lang.IllegalArgumentException: Tmp detached view should be removed from RecyclerView before it can be recycled

如何取消未完成的通知?

2 个答案:

答案 0 :(得分:3)

您可以等待动画完成,然后执行通知。这应该有助于避免您的异常情况:

RecyclerView.ItemAnimator animator = mRecyclerView.getItemAnimator();
animator.isRunning(() -> {
    mAdapter.setItems(itemList);
    mAdapter.notifyDataSetChanges();
});

答案 1 :(得分:0)

我也遇到了同样的问题。我还使用了DiffUtil.calculateDiff()方法来顺利更新我的RecyclerView。但是据我所知,在我的Activity / Fragment停止运行时,有一些待处理的更新是在恢复到屏幕后触发的。

帮助我清除此暂挂更新的原因是在adapte.notifyDataSetChanged中调用onStop。同样在recyclerView.hasPendingAdapterUpdates的帮助下,我能够检查是否有任何待处理的更新。

@Override
public void onStop() {
    if (recyclerView.hasPendingAdapterUpdates()) {
        adapter.notifyDataSetChanged();
    }
    super.onStop();
}

p.s。您还应确保布局中没有android:animateLayoutChanges=trueRecyclerView,并且没有在RecyclerView中使用NestedScrollView