[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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 127,724评论 18 546
  • 做一个类似微信朋友圈的小任务,信心满满地打算使用ListView控件完成,和小组一讨论发现大家都推荐我用Recyc...
    sunnyaxin阅读 1,540评论 4 22
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 30,848评论 21 577
  • 简介: 提供一个让有限的窗口变成一个大数据集的灵活视图。 术语表: Adapter:RecyclerView的子类...
    酷泡泡阅读 1,847评论 0 15
  • 11.6 这一天上班都不在状态。心里惦记着七七,上着淘宝网打算双十一给他买一些用的吃的,但又怕到双十一来不及...
    neriah阅读 41评论 0 0