ListView异步加载网络图片之二

[align=center][size=large][b]ListView异步加载网络图片之二[/b][/size][/align]
[size=large] 上一篇文章中卖了一个关子,遗留下来两个bug,不知道有没有同学发现,或者已经解了,那么这一篇文章我将解决其中一个bug(呵呵继续卖。。。)[/size]
[size=large][b]问题描述:[/b]当我们把列表向下滚动再向上滚动反复的操作,本来应该是iteye的logo和妮露(看死神的同学应该知道)交替显示的,但是悲剧却发生了,图片乱了。
[b]问题产生的原因:[/b]由于listview中列表项的view是复用的,当后台返回图片,并执行onPostExecute方法中调用这一句mViewHolder.mImageView.setImageBitmap(result)的时候,他会影响到所有复用的item,而这个时候你的列表已经滚动了,所以你就看到图片显示不正常了。
[b]问题解决方案:[/b]根据问题产生的原因,我们就[color=red]不要在onPostExecute方法中去调用[/color]mViewHolder.mImageView.setImageBitmap(result)方法,[color=red]那么我们应该在哪儿调用呢?[/color]这儿不调用,那么我们的imageview怎么知道图片已经下载好了呢?我们只需要[color=red]调用adapter的notifyDataSetChanged()[/color]方法,他会触发getView方法的调用,而在getView方法中就直接去缓存中拿图片了([color=red]这样在屏幕可见范围的item都是正常的,不可见的无聊他显示神马我们都不用关心[/color]),所以在onPostExecute方法中我们只需要将下载好的图片放入缓存,并且通知adapter数据发生了变化。
[/size]

class ImageLoadTask extends AsyncTask<Object, Void, Bitmap> {
int position;

@Override
protected Bitmap doInBackground(Object... params) {
String url = (String) params[0];
position = (Integer) params[1];
Bitmap drawable = ImageLoader.loadImage(url);// 获取网络图片
return drawable;
}
@Override
protected void onPostExecute(Bitmap result) {
if (result == null) {
return;
}
/**
* 由于列表项的view是复用的,所以所有复用的view的图片都会被改变
*/
//mViewHolder.mImageView.setImageBitmap(result);
cacheImage(position, result);// 放入缓存
/**
* 通知数据发生改变,会触发adapter的getView方法调用
* 将视图的更新统一到getView方法去调用,因为我们只需要关心屏幕内的内容
* 屏幕中看不到的内容我们是不需要去调用setImageBitmap这个方法的
*/
notifyDataSetChanged();
}
}

[size=large][b]总结:[/b]说了这么多,我也不知道看这篇文章的同学能不能够看懂,这个问题还是挺绕的,我的文字表达能力很有限。如果不明白的可以单聊。[color=red]当然这个bug是解决了,还有一个更严重的bug,可以直接让我们脆弱的demo崩掉,不信你试一试,预知详解,敬请关注下一期博客[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值