RecyclerView 报IndexOutOfBoundsException 解决方法

RecyclerView在什么情况下会产生这个异常?

就我来说,是在刷新页面的同时,进行快速地滑动。异常的Log为:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid 
item position 17(offset:17).state:32 at 
android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(Recy
clerView.java:4641)                                                                             at 
android.support.v7.widget.
...

为什么会报这个异常?

这是因为在刷新页面的时候,一般会清空之前的数据,然后再装填新的数据,并且在装填新数据完毕的时候NotifyItemRangeChanged.

public void setItems(List<T> newItems) {
        validateItems(newItems);
        this.items.clear();
        this.items.addAll(newItems);
        notifyItemRangeChanged(startPosition, newItems.size());
}

怎么解决?

每次操作数据时,都发出通知

public void setItems(List<T> newItems) {
        validateItems(newItems);

        int startPosition = hasHeader() ? 1 : 0;
        int preSize = this.items.size();
        if(preSize > 0) {
            this.items.clear();
            notifyItemRangeRemoved(startPosition, preSize);
        }
        this.items.addAll(newItems);
        notifyItemRangeChanged(startPosition, newItems.size());
    }

notifyItemRangeRemoved 之后,再 addAll, RecyclerView 加载Item的时候,自带动画,挺爽。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,079评论 25 709
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,971评论 22 665
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,194评论 4 61
  • 这几天对“践行”这个词又加深了认识。 之前老师提到过: “很多人并不会在意你的推荐,除非他们之前对此已经认同”。 ...
    念念1999阅读 1,937评论 0 0
  • 傍晚,格格拿着一把用竹子打制的剑站在厨房的一角一边玩弄着一边陪我择菜,突然对我喃喃的说:“妈妈,昨天姐姐非要...
    紫陌素荷2阅读 1,664评论 0 0