天天看点

recyclerView 遇到IndexOutOfBoundsException 及解决

     做项目时用到了recyclerView,至于recyclerView是啥应该不用多解释了,具体用法也不介绍了,不懂的同学自行学习一下,网上很多大神已经介绍的很清楚了,我就不啰嗦了0.0

     在使用recyclerView时遇到了一个问题,上下滑动时有时候应用会崩溃,看错误日志也只是有一个recyclerView的IndexOutOfBoundsException,全是Android底层的错误,和我们写的代码没有一点关系,关键是这个错误知识偶尔出现,刚开始不知道什么什么操作就崩了,后来发现了,只要在刷新的时候滑动就会蹦,既然知道什么情况崩了就有处下手了。

    去网上搜错误原因,才知道是Android底层的一个bug,原因是在刷新数据的时候数据的list的size变为0,这时再滑动就会数组越界了,然后就崩了。我用的是Android在带的下拉刷新控件SwipeRefreshLayout,

    既然是list为空后滑动导致的崩溃,那直接在刷新数据时禁止recyclerView滑动不就行了。

    顺着这个思路,在SwipeRefreshLayout的下拉事件setOnRefreshListener中禁止recyclerView滑动,然后在网络请求结束后恢复滑动。

refreshLayout.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {//下拉刷新事件

@Override

   public voidonRefresh() {

            list_recyclerview.clear();//recycleyView 的数据list

           //重写recyclerView的onTouch事件

            mRecyclerView.setOnTouchListener(newView.OnTouchListener() {

           @Override

           public booleanonTouch(View v,MotionEvent event) {

                return true;//返回true

         }

});

         getDataFromHttp();

        }

privateHandlerhandler=newHandler() {

     @Override

      public voidhandleMessage(Message msg) {

      refreshLayout.setRefreshing(false);//隐藏进度条

      list_recyclerview.clear();//清空list

      JSONObject json = (JSONObject) msg.obj;

      list_recyclerview.addAll(news_content_jsonUtil.getList(json));//解析json数据并更新list

      adapter.notifyDataSetChanged();//更新到adapter

mRecyclerView.setOnTouchListener(newView.OnTouchListener() {//恢复recyclerView的滑动事件

     public booleanonTouch(View v,MotionEvent event) {

            return false;

          }

    });

}

       这样就可以解决recyclerView更新数据时滑动崩溃的问题了,网上也有很多大神给出了别的解决办法,我试过一种没起作用,可能是我用的不对,我用这种解决了0.0    

    我也是小菜鸟,问题产生的底层原因我也没有分析源码,这种问题还是留给Google来解决吧。