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();
以上个人理解之处,有问题可以指正,共同更改.....