转自: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都会去请求网络数据,没有缓存操作,还是要继续优化项目代码才好。