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


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 1
	at 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();


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






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值