[Android] RecyclerView的Bug:IndexOutOfException

本文介绍项目中使用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数据已改变。

你可能感兴趣的:([Android] RecyclerView的Bug:IndexOutOfException)