Android知识总结:ListView 出现IndexOutOfBoundsException异常
来源:互联网 发布:淘宝拉夏贝尔代购 编辑:程序博客网 时间:2024/06/07 22:20
背景
今天在整理友盟统计bug时,发现有几个bug集中在首页ListView的Adapter上,具体翻来,大概是说ListView中数据出现越界。具体错误日志大概如下:
java.lang.IndexOutOfBoundsException: Invalid index 4, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) at java.util.ArrayList.get(ArrayList.java:304) ... ...
也就是说,我们的ListView中的数据列表长度为0,但是我们索引到了index为4的数据。卧槽,ListView数组的内容不是由Adapter管理的吗,为什么此处会产生越界?
翻阅了一些网页,大家都提到ListView是异步的,也有些说法是不要使用Adapter的notifyDataSetChanged方法,我也开始怀疑是不是notifyDataSetChanged方法使用的不对。总之,想要复现这个bug似乎并不是很容易。
既然复现不了,那么我们就再捋一下代码,看看能不能找到什么线索,代码中请求数据和刷新数据的流程大概如下:
mDataList.clear();//清空列表final GsonRequest<HomeJson> request = new GsonRequest<>(url, HomeBean.class, psd, new Response.Listener<HomeBean>() { @Override public void onResponse(HomeJson response) { if (请求数据成功) { //更新数据列表 mDataList = response.getData(); //进行notifyDataSetChanged showView(); ... ...
我们的流程是,先清空列表,然后进行网络加载,当加载成功后将数据赋值给Adapter,然后notifyDataSetChanged。那么,请求网络过程中呢…… 当然还显示页面上的ListView了,那么,当请求网络的过程中有人滚动屏幕呢,我们ListView中的数据已经清空,那么Adapter的getView中将无法拿到要显示的数据。这样,就出现了数组长度为0,但是索引index为大于0的数字的情况。
这也正是体现了ListView的异步,虽然数据变化了,但是ListView本身并不知道,所以我们需要及时调用notifyDataSetChanged,告诉ListView数据变化啦,你显示的时候要用新数据了。
我们可以进行如下修改:
... ... mDataList.clear();//更新数据列表 mDataList = response.getData();//进行notifyDataSetChangedshowView(); ... ...
我们在网络请求完毕后删除List的数据,然后直接进行notifyDataSetChanged,这样始终保持ListView与数据列表是同步的,就不会出现数据列表与index不同步而出现IndexOutOfBoundsException的问题了。
- Android知识总结:ListView 出现IndexOutOfBoundsException异常
- android listview setOnItemClickListener IndexOutOfBoundsException
- RecyclerView 出现了 IndexOutOfBoundsException 异常
- ListView 点击加载更多出现异常(java.lang.IndexOutOfBoundsException: Invalid index 10, size is 10)
- Android listview 在OnItemClick初出现下标越界 java.lang.IndexOutOfBoundsException
- Android ListView IndexOutOfBoundsException ViewHolder类型转化错误
- Android知识总结--ListView的BaseAdapter抽取
- EditText报IndexOutOfBoundsException异常
- Android - ViewPager使用PagerAdapter,instantiateItem时出现IndexOutOfBoundsException
- Android - ViewPager使用PagerAdapter,instantiateItem时出现IndexOutOfBoundsException
- Android - ViewPager使用PagerAdapter,instantiateItem时出现IndexOutOfBoundsException
- ListView 相关知识总结
- ListView知识总结
- android开发中难免遇到listview刷新数据出现异常
- listview下拉加载后点击item报 java.lang.IndexOutOfBoundsException异常
- Listview添加完HeaderView或者FooterView后,点击相应的view出现IndexOutOfBoundsException问题修复
- 异常知识总结
- Java异常知识总结
- 给图像添加边界
- mysql 事务
- Handlebars.js 使用入门
- 在命令提示符窗口进入MYSQL数据库的方法(转)
- MultipleRegularExpressionAttribute MVC中扩展自定义验证规则
- Android知识总结:ListView 出现IndexOutOfBoundsException异常
- elgg安装
- Swift编程基础(二):字符与字符串
- overfeat的网络架构
- nyoj17单调递增最长子序列(N*logN)
- JavaEE web项目目录结构
- android:largeHeap="true"
- Android获取新收到的短信内容
- An Experimental Survey on Correlation Filter-based Tracking