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