RecyclerView 报IndexOutOfBoundsEx

作者: 大姨夫斯基 | 来源:发表于2016-03-18 18:42 被阅读7446次

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的时候,自带动画,挺爽。

相关文章

网友评论

    本文标题:RecyclerView 报IndexOutOfBoundsEx

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