`
酷的飞上天空
  • 浏览: 517775 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

关于ListView中异步加载图片时,图片显示错误的问题

 
阅读更多

关于ListView的优化网上有不是的文件介绍,比如:

http://shazhuzhu1.iteye.com/blog/985911

 

也就是使用缓存convertView的形式,避免重新findViewById的时间开销。

 

这个地方有一种很常见的情况未说明:

当被缓存的convertView里面包含ImageView并且图片数据又是从网上获取的时候,就会出现ListView中某个和多个位置的图片不断变换的问题。

 

原因是被缓存的convertView并不只是缓存了View的结构,而是把上个View全部内容都缓存了包括图片。这就造成每次都先显示已经出现的图片,然后才被替换为正确的图片。

 

而图片的不停变换的问题则是如下代码的原因:

		asyncImageLoader.loadDrawable(stringList.get(position).get()[1], new AsyncImageLoader.ImageCallback() {
			@Override
			public void imageLoaded(Drawable imageDrawable, String imageUrl) {
				if(imageDrawable != null){
					imageView.setImageDrawable(imageDrawable);
				}
			}
		});
 

这是一段异步加载图片的代码。

当ListView被快速滑动时,因为缓存了convertView所以如果有N此调用这个异步加载图片的方法,则此convertView的图片就会被设置N次。

当最后一次显示convertView时,其当前显示的图片则根据前几次异步加载的图片进行显示,优先加载完成的图片被优先显示。

 

解决方法:

1.不使用缓存的convertView,每次都重新inflate一个新的

2.不使用XML通过代码自己构造convertView,避免掉配置文件的解析时间

0
0
分享到:
评论
3 楼 fyc0109 2013-03-07  
那就是说两种方法原理都是一样的,只不过第二种是第一种的优化.我总觉得还是不是太好!
2 楼 酷的飞上天空 2012-05-25  
changliangno1 写道
勉强接受第二种做法,而且是只new imageview,然后再添加到itemView中去。

我自己的做法是自定义imageView再其中添加刷新drawable的方法


可以使用给缓存的view设置tag的方式解决
参考http://314858770.iteye.com/blog/1442272
1 楼 changliangno1 2012-05-22  
勉强接受第二种做法,而且是只new imageview,然后再添加到itemView中去。

我自己的做法是自定义imageView再其中添加刷新drawable的方法

相关推荐

    listview 图片异步加载 图片错位 软引用 getView调用次数 convertView重用

    ListView异步加载图片,图片错位问题解决方案 * 问题分析:我们在使用AsyncTask异步下载图片的时候,经常会用到convertView的重用,一般情况下,滑动后第一个可见的元素(我们给它命个名,称为A1)和 * listview...

    ListView异步加载图片

    ①ListView异步加载图片的方式 ②给ImageView设置Tag,解决图片覆盖问题 ③采用LruCache缓存已经加载过的图片 ④当ListView滚动时不加载图片,滚动停止时才加载图片,从而达到ListView滑动很流畅的效果 ⑤当...

    android中ListView异步加载图片时的图片错位问题解决方案

    android中ListView异步加载图片时的图片错位问题解决方案

    listview异步加载优化实例

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标。关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题...

    实现ListView的异步加载,图片的本地缓存,以及手势识别

    解决ListView滑动是卡的问题解决,实现异步加载图片,本地图片缓存,滚动手势识别

    listview 异步动态加载网络图片 有效解决oom问题

    listview 异步动态加载网络图片 有效解决oom问题 讲这个工具类拷贝到你工程中。 调用方法很简单: ImageLoader imageLoader = new ImageLoader(context); imageLoader.DisplayImage(imageUrl, imageView);

    android中ListView异步加载图片错位

    android中ListView异步加载图片时的图片错位问题解决方案

    Android ListView 异步加载图片

    2.监听listview滑动停止事件,获得listview显示的item的最上面和最下面的序号,并唤醒所有加载图片的thread,判断加载图片的序号是否是在范围内,如果是则继续加载,如果不是则结束thread 3.就是把之前的new Thread...

    android ListView,GridView 高效异步加载图片例子

    ListView和GridView里加载图片,有很多种实现方式,但是如果用不好很容易导致各种问题,比如内存溢出、...现在我将开源项目GreenDroid里异步加载图片代码提取出来做成一个jar包。有效解决了上面的问题,而且用法简单。

    Listview的异步加载性能优化

    关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化,下面就让在下阐述其原理以探索个中奥秘在APP应用中,listview的异步加载图片方式能够带来很好的...

    Android开发之listview优化+图片异步加载缓存+避免图片显示闪烁

    很多朋友在Android开发listview过程中都会碰到问题 比如从网上下载图片显示在界面 如果图片稍微大一点就会出现oom 或者显示的时候很容易出现图片闪烁等 这个项目能帮你解决

    AndroidListView异步加载图片乱序问题,原因分析及解决方案.docx

    AndroidListView异步加载图片乱序问题,原因分析及解决方案.docx

    Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    Android ListView异步加载图片错位、重复、闪烁分析以及解决方案,具体问题分析以及解决方案请看下文。 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位、重复、闪烁等问题...

    android gridview/listview加载大量图片

    2. 将getView中需要加载的图片添加进堆栈,启动异步线程从栈顶开始加载图片,保证当前显示区域的图片被先显示。 3. 调整Load线程优先级为Thread.NORM_PRIORITY-1,不要和UI线程抢时间片,使滚动更流畅。 该代码用...

    ImageView异步加载图片ImageLoaderSample.zip

    这个可以实现ImageView异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画。解决了:1. listview加载oom问题 2. listview加载时卡顿的现象 3. listview加载时item中图片重复错位等情况 可以...

    ListView异步加载图片实现思路(优化篇)

    关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化。有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索...

    Android网络图片异步加载实例

    最近一段处理跟图片相关的问题,本来是自己写的图片加载,不过有些状态的控制还是比较烦人的,比如ListView滚动时ImageView的重用,所以本着偷懒与充分利用现有资源的态度去网上搜罗图片异步加载的代码,最终在...

    Android-异步图片加载器

    在ListView中加载图片是非常常见的场景,图片的加载要满足下面的几个要求: (1)不管图片是位于网络还是本地,加载都不应该是同步的,而是应该异步去加载,比如用AsyncTask。 (2)为了避免重复下载图片和页面展示...

Global site tag (gtag.js) - Google Analytics