本文介绍项目中使用RecyclerView遇到的一个小坑。
异常原因:java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 10…
复现手法:RecyclerView使用SwipeRefreshLayout下拉刷新数据,迅速上滑RecyclerView,这时新数据还没到来,RecyclerView要加载下面的Item,又没有数据源,就会造成崩溃,而且异常不会报到我们的代码上,抛出RecyclerView内部错误。
解决办法:
1.下滑的同时到adapter更新数据完毕,让RecyclerView暂时禁止滑动。
rvActivityList.setOnTouchListener(newView.OnTouchListener() {
@Override
public booleanonTouch(View v,MotionEvent event) {
if(isDoingRefresh) {
return true;
}else{
return false;
}
}
});
//当刷新时设置//mIsRefreshing=true;//刷新完毕后还原为false//mIsRefreshing=false;此方法用户体验差,极为不明智。
2.第二种方法
我们在进行数据移除和数据增加时,务必要保证RecyclerView的Adapter中的数据集和移除/添加等操作后的数据集保持一致!
外部数据集同步到内部数据集,使用如下的方法:
notifyItemRangeRemoved();
notifyItemRangeInserted();
notifyItemRangeChanged();
notifyDataSetChanged();
使用notifyDataSetChange()方法更新内部数据集,没有默认的动画效果,同时更新数据的效率页不如上面的方法,官方不推荐使用这种方式更新数据集,个人认为使用这个还不如使用ListView。
mLeaveList.clear();
mAdapter.notifyItemRangeRemoved(0,preListSize);//通知RecyclerView移除数据集
mLeaveList.addAll(result);
mAdapter.notifyItemRangeInserted(0,mLeaveList.size());//更新RecyclerView数据集
每次对List进行操作时,通知到Adapter数据已改变。