Android ListView异步加载图片错位、重复、闪烁分析以及解决方案
2015-10-30 13:25
465 查看
转自:http://blog.csdn.net/shineflowers/article/details/41744477
项目中listview使用volley加载网络图片,由于convertview的重用,导致异步加载图片会错位闪烁重复等,
所以解决方案是:holder.imageview.setImageBitmap(null);
holder.imageview.setTag(url);
然后在图片加载成功的onResponse中添加如下代码:
if(imageview.getTag().equals(url))
{
imageview.setImageResource(...).
}
过程:因为listview每次滑动,如果有新的item进入,就会调用一次getView,在获取到imageview之后,设为空白无图的,tag为当前显示的item的url,而且此时会调用加载图片的异步线程,而这个线程可能包括已经滑过的但是还没有结束的加载线程。
比如,listview一页显示10条item,即第一条的item对应第11条,对应第21条,1->11->21...,如果滑动过快,从1直接滑动到21,这一项复用item的imageview的tag依次是url1,url11,url21;由于当前要显示第21条数据,而第11条的数据也被加载了,如果第11条数据加载完成,但是由于此时图片地址(url11)不等于imageview的tag(url21),所以此时仍然显示为空白。当第21条数据加载完成时,符合要求,imageview设置图片为url21,解决了图片重复闪烁问题。
遗留的问题:项目中目前使用的是每次更新view都会去请求网络数据,没有缓存操作,还是要继续优化项目代码才好。
项目中listview使用volley加载网络图片,由于convertview的重用,导致异步加载图片会错位闪烁重复等,
所以解决方案是:holder.imageview.setImageBitmap(null);
holder.imageview.setTag(url);
然后在图片加载成功的onResponse中添加如下代码:
if(imageview.getTag().equals(url))
{
imageview.setImageResource(...).
}
过程:因为listview每次滑动,如果有新的item进入,就会调用一次getView,在获取到imageview之后,设为空白无图的,tag为当前显示的item的url,而且此时会调用加载图片的异步线程,而这个线程可能包括已经滑过的但是还没有结束的加载线程。
比如,listview一页显示10条item,即第一条的item对应第11条,对应第21条,1->11->21...,如果滑动过快,从1直接滑动到21,这一项复用item的imageview的tag依次是url1,url11,url21;由于当前要显示第21条数据,而第11条的数据也被加载了,如果第11条数据加载完成,但是由于此时图片地址(url11)不等于imageview的tag(url21),所以此时仍然显示为空白。当第21条数据加载完成时,符合要求,imageview设置图片为url21,解决了图片重复闪烁问题。
遗留的问题:项目中目前使用的是每次更新view都会去请求网络数据,没有缓存操作,还是要继续优化项目代码才好。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories