Recycleview bug recycleview bug

2019-05-30  本文已影响0人  itwillrain

这个异常通常是由于Adapter的数据源大小改变没有及时通知RecycleView做UI刷新导致的,或者通知的方式有问题。 比如如果数据源变化了(比如数量变少了),而没有调用notifyXXX, 那么此时滚动RecycleView就会产生这个异常。

解决办法很简单 :Adapter的数据源改变时应立即调用adapter.notifyXXX来刷新RecycleView

分析一下这个异常为什么会产生:

在RecycleView刷新机制一文介绍过,RecycleView的滚动操作是不会走RecycleView的正常布局过程的,它直接根据滚动的距离来摆放新的子View。 想象一下这种场景,原来数据源集合中

有8个Item,然后删除了4个后没有调用adapter.notifyXXX(),这时直接滚动RecycleView,比如滚动将要出现的是第6个Item,LinearLayoutManager就会向Recycler要第6个Item的View:

Recycler.tryGetViewHolderForPositionByDeadline():

final int offsetPosition = mAdapterHelper.findPositionOffset(position);  //position是6 if (offsetPosition < 0 || offsetPosition >= mAdapter.getItemCount()) {    //但此时  mAdapter.getItemCount() = 5

        throw new IndexOutOfBoundsException("Inconsistency detected. Invalid item "

                + "position " + position + "(offset:" + offsetPosition + ")."

                + "state:" + mState.getItemCount() + exceptionLabel());

}

即这时就会抛出异常。如果调用了adapter.notifyXXX的话,RecycleView就会进行一次完全的布局操作,就不会有这个异常的产生。

其实还有很多异常和这个原因差不多,比如:IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false(很多情况也是由于没有及时同步UI和数据)

所以在使用RecycleView时一定要注意保证数据和UI的同步,数据变化,及时刷新RecyclerView, 这样就能避免很多crash。

作者:慕少0579507

链接:http://www.imooc.com/article/279703

来源:慕课网

上一篇下一篇

猜你喜欢

热点阅读