您的位置:首页 > 其它

关于ListView异步加载图片导致图片显示混乱以及ListView ...

2014-05-16 17:25 399 查看
前面看到有帖子中有人使用notifyDataSetChanged()来解决ListView中异步加载图片第一张图片显示错误问题。首先在数据源没有变化的情况下没有必要使用notifyDataSetChanged(),会导致调用requestLayout()重绘当前界面的列,就是重新走getView().所以notifyDataSetChanged()在图片都已下载缓存完的情况下正常显示了,但是因为重新刷新界面了导致了效率变低。其实要知道ListView图片混乱都是因为重用了ConvertView,但这个是ListView性能的关键。我们为什么说建议在ListView中使用ViewHolder,按我的理解其一是能够保存ConvertView中各个View的引用,使得不需要每次都findViewById严重影响效率,其二是我们可以拿到View的引用后使用setTag()和getTag()方法,道理跟ConvertView.setTag()和ConvertView.getTag()是一样的。所以在异步加载图片的时候我们给予ImageView一个Tag,在加载完成回调的时候根据这个Tag来判断是否要把图片设置到当前的ImageView中。
1
private
final
ArrayList<View> mActiveImages =
new
ArrayList<View>();
01
@Override
02
public
View getView(
int
position, View convertView, ViewGroup parent) {
03
ViewHolderholder = 
null
;
04
if
(convertView == 
null
){
05
//inflate convertView
06
holder= 
new
ViewHolder();
07
//initial holer,means findViewById
08
convertView.setTag(holder);
09
}
else
{
10
holder= (ViewHolder)convertView.getTag();
11
}
12
//do your stuff
13
14
//add first then load icon,make sure we have the image holding the icon is contained at mActiveImages
15
mActiveImages.remove(holder.mIcon);
16
mActiveImages.add(holder.mIcon);
17
//set tag to imageview for not messing up the images
18
holder.mIcon.setTag(
"yourtag"
);
19
//here load Icon
20
 
21
return
convertView;
22
}
另外要善于利用AbsListView.RecyclerListener接口,使用这个接口可以达到只更新当前界面那些列的图片以及释放其他资源。viewsource
01
@Override
02
public
void
onMovedToScrapHeap(View view) {
03
ViewHolderholder = (ViewHolder)view.getTag();
04
mActiveImages.remove(holder.mIcon);
05
}
06
07
@Override
08
public
void
setIcon(ImageView image, String tag, Drawable drawable) {
09
if
(mActiveImages.contains(image) && tag.equals(image.getTag())) {
10
image.setImageDrawable(drawable);
11
}
12
}
以上是我的看法,欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: