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 newItems) {
        validateItems(newItems);
        this.items.clear();
        this.items.addAll(newItems);
        notifyItemRangeChanged(startPosition, newItems.size());
}

怎么解决?

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

public void setItems(List 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 报IndexOutOfBoundsException 解决方法)