美文网首页
RecyclerView#IndexOutOfBoundsExc

RecyclerView#IndexOutOfBoundsExc

作者: Jiun俊 | 来源:发表于2018-05-28 14:54 被阅读0次

异常现象

设置适配器 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 操作之间的间隔无关。

解决方案:

  1. 先 remove,再notifyItemRemoved, 最后再notifyItemRangeChanged
    remove:把数据从list中remove掉,
    notifyItemRemoved:显示动画效果
    notifyItemRangeChanged:对于被删掉的位置及其后range大小范围内的view进行重新onBindViewHolder
  2. 将对数据源 mDataList 的操作集中在一起,有新的数据源后,再 clear → addAll → Adapter.notifyXxx 行云流水般的操作,不要有间隔。主要针对上面『必现方式』的对症下药,亲测有效。

相关文章

网友评论

      本文标题:RecyclerView#IndexOutOfBoundsExc

      本文链接:https://www.haomeiwen.com/subject/jsrgjftx.html