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
如何取消未完成的通知?
答案 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=true
和RecyclerView
,并且没有在RecyclerView
中使用NestedScrollView
。