Android异常--6. java.lang.IndexOutOfBoundsException: Invalid index 1 ,size is 1

来源:互联网 发布:简单视频特效软件 编辑:程序博客网 时间:2024/06/13 00:39


Android异常汇集----6. java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1


1.异常描述

    实现listview上拉刷新操作,在 数据清空 list.clear(); 和 list.addAll(list); 

    偶尔出现此问题,出现异常完整信息如下:

java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)at java.util.ArrayList.get(ArrayList.java:308)at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)at android.widget.ListView.dispatchDraw(ListView.java:3408)at android.view.View.draw(View.java:15593)at android.widget.AbsListView.draw(AbsListView.java:4642)at android.view.View.updateDisplayListIfDirty(View.java:14471)at android.view.View.getDisplayList(View.java:14501)at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3517)at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3496)at android.view.View.updateDisplayListIfDirty(View.java:14421)at android.view.View.getDisplayList(View.java:14501)at android.view.View.draw(View.java:15286)at android.view.ViewGroup.drawChild(ViewGroup.java:3533)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3327)at android.view.View.draw(View.java:15593)at android.view.View.updateDisplayListIfDirty(View.java:14471)at android.view.View.getDisplayList(View.java:14501)at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3517)at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3496)
可以看到是数组越界,但是很多人都无法做出定位错误地点,

 

2.分析过程

      自己用了别的上拉刷新框架,RefreshableListView也会出现,  只要做做出list.clear() 或者list.add() 就会出现此现象。

 if (Action == REFRESH_GET) {list.clear();        list = list_new;mhHandler.sendEmptyMessage(4); }
    当我们不做此操作,就不会发生,问题就出现这里。网上资料也很多提到。

     //数据源清空以前的数据
      this.list.clear();
     this.list.addAll(list);  
     // 发送异步消息
     msgHandle.obtainMessage()

      原因在list.clear()和list.addAll两个对于集合的操作是在异步线程当中,修改完list之后才通过handler发消息去更新UI,
     在这间隔中如果ListView调用draw方法就会报异常,重新给数据源一个新的引用,重新给适配器可以

 

3. 解决方法

      建议将

if (Action == REFRESH_GET) {list.clear();        list = list_new;mhHandler.sendEmptyMessage(4); }
    改为

    if(Action==Refresh_GET){
       Message msg=new Message();

       msg.obj=list_new;

       mhHandler.sendMessage(msg);

    }

  在handler中处理消息,将list跟adapter在同一线程中处理

  list=list_new

     weixinAdapter adapter=new weixinAdapter(getActivity());
     adapter.setData(list);
     mlistview.setAdapter(adapter);
     adapter.notifyDataSetChanged();


   以上个人理解之处,有问题可以指正,共同更改.....






0 0
原创粉丝点击