异常现象
设置适配器 Adapter 的 RecyclerView,操作 Adapter 对数据进行操作时(如:notifyItemRemoved() 或 notifyDatasetChanged()),会出现异常 IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder……
导致崩溃。
/*
# 原因: Not Sure
函数里面的传入的参数position,它是在进行onBind操作时确定的,在删除单项后,已经出现在画面里的项不会再有调用onBind机会,这样它保留的position一直是未进行删除操作前的postion值。
对于尚未进入画面的单项来说,它会使用新的position值,这个值是正确的,如果在单项里加上下面的代码
在删除第一屏的一项后,向上滚动,会发现新滚上来的一行和它上面的一行的textview显示是一样的。
*/
必现方式(实测)
对数据源,操作两次,比如 mDataList.clear()
,mDataList.addAll(dataList)
,两次中间有加以时间间隔,比如 1s,然后再调用mAdapter.notifyDatasetChanged()
,在这期间不停的上下滑动 RecyclerView,这样在 notifyDatasetChanged()
的时候就会出现如上错误。
和数据源 mDataList 操作的间隔有关,mDataList 的操作与 mAdapter 操作之间的间隔无关。
解决方案:
- 先 remove,再notifyItemRemoved, 最后再notifyItemRangeChanged
remove:把数据从list中remove掉,
notifyItemRemoved:显示动画效果
notifyItemRangeChanged:对于被删掉的位置及其后range大小范围内的view进行重新onBindViewHolder - 将对数据源 mDataList 的操作集中在一起,有新的数据源后,再 clear → addAll → Adapter.notifyXxx 行云流水般的操作,不要有间隔。主要针对上面『必现方式』的对症下药,亲测有效。
网友评论