如何实现ListView异步加载图片

listview 图片异步加载 图片错位 软引用 getView调用次数 convertView重用 ListView异步加载图片,图片错位问题解决方案 * 问题分析:我们在使用AsyncTask异步下载图片的时候,经常会用到convertView的重用,一般情况下,滑动后第一个可见的元素(我们给它命个名,称为A1)和 * listview的第一个元素(A)是公用一个convertView的(一般情况),此时问题就来了,如果异步下载图片执行的比较慢,第一个元素对应的url * 下载的图片会放到第一个元素上面还是滑动后第一个可见的元素上面呢? * 解决方案:给每个listview的ImageView设置tag,使用findViewWithTag()的方式来得到ImageView,此时图片就不会产生错位了。而且 * 值得注意的是,由于A和A1使用同一个convertView,因此如果A中的ImageView已经有值得话,当A2展示的并且它所对应的图片还未加载完成的时候, * A2会显示A上的图片,这明显是不对的,因此我们这里给它设置一个默认的icon,即mHolder.mImageView.setImageResource(R.drawable.ic_launcher); * 思路简介:一般listview中涉及到图片加载的,为了提高用户体验,一般会使用一个软引用和存文件的方式来实现。不过还见过这样来实现的:即用一个HashMap来存放很小一部分的数据, * 当HashMap中的大小达到一定的值时,清空HashMap,并且将数据放入软应用中。 * 注意操作sdcard权限已经网络访问权限的加入 立即下载

ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法可以带来较好的用户体验。下面就给大家说明如何让实现该方法:


Java代码

1        package cn.wangmeng.test; 

2          

3        import java.io.IOException; 

4        import java.io.InputStream; 

5        importjava.lang.ref.SoftReference; 

6        importjava.net.MalformedURLException; 

7        import java.net.URL; 

8        import java.util.HashMap; 

9          

10    importandroid.graphics.drawable.Drawable; 

11    import android.os.Handler; 

12    import android.os.Message; 

13      

14    public class AsyncImageLoader { 

15      

16         private HashMap<String, SoftReference<Drawable>>imageCache; 

17            

18             public AsyncImageLoader() { 

19                 imageCache = new HashMap<String,SoftReference<Drawable>>(); 

20             } 

21            

22             public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) { 

23                 if(imageCache.containsKey(imageUrl)) { 

24                     SoftReference<Drawable>softReference = imageCache.get(imageUrl); 

25                     Drawable drawable =softReference.get(); 

26                     if (drawable != null) { 

27                         return drawable; 

28                     } 

29                 } 

30                 final Handler handler = new Handler() { 

31                     public void handleMessage(Messagemessage) { 

32                         imageCallback.imageLoaded((Drawable)message.obj, imageUrl); 

33                     } 

34                 }; 

35                 new Thread() { 

36                     @Override 

37                     public void run() { 

38                         Drawable drawable =loadImageFromUrl(imageUrl); 

39                         imageCache.put(imageUrl, new SoftReference<Drawable>(drawable)); 

40                         Message message =handler.obtainMessage(0, drawable); 

41                         handler.sendMessage(message); 

42                     } 

43                 }.start(); 

44                 return null; 

45             } 

46            

47            public static DrawableloadImageFromUrl(String url) { 

48                URLm; 

49                InputStream i = null; 

50                try { 

51                    m = new URL(url); 

52                    i =(InputStream) m.getContent(); 

53                } catch (MalformedURLException e1){ 

54                    e1.printStackTrace(); 

55                } catch (IOException e) { 

56                    e.printStackTrace(); 

57                } 

58                Drawabled = Drawable.createFromStream(i, "src"); 

59                return d; 

60            } 

61            

62             public interface ImageCallback { 

63                 public void imageLoaded(DrawableimageDrawable, String imageUrl); 

64             } 

65      

66    } 


以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。

几个辅助类文件:

Java代码

67    package cn.wangmeng.test; 

68      

69    public class ImageAndText { 

70            private String imageUrl; 

71            private String text; 

72      

73            public ImageAndText(String imageUrl, String text) { 

74                this.imageUrl = imageUrl; 

75                this.text = text; 

76            } 

77            public String getImageUrl() { 

78                return imageUrl; 

79            } 

80            public String getText() { 

81                return text; 

82            } 

83    } 


Java代码

84    package cn.wangmeng.test; 

85      

86    import android.view.View; 

87    importandroid.widget.ImageView; 

88    importandroid.widget.TextView; 

89      

90    public class ViewCache { 

91      

92            private View baseView; 

93            private TextView textView; 

94            private ImageView imageView; 

95      

96            public ViewCache(View baseView) { 

97                this.baseView = baseView; 

98            } 

99      

100         public TextView getTextView() { 

101             if (textView == null) { 

102                 textView = (TextView)baseView.findViewById(R.id.text); 

103             } 

104             return textView; 

105         } 

106   

107         public ImageView getImageView() { 

108             if (imageView == null) { 

109                 imageView = (ImageView)baseView.findViewById(R.id.image); 

110             } 

111             return imageView; 

112         } 

113   

114 } 


ViewCache是辅助获取adapter的子元素布局


Java代码

115 package cn.wangmeng.test; 

116   

117 import java.util.List; 

118   

119 importcn.wangmeng.test.AsyncImageLoader.ImageCallback; 

120   

121 import android.app.Activity; 

122 importandroid.graphics.drawable.Drawable; 

123 import android.view.LayoutInflater; 

124 import android.view.View; 

125 import android.view.ViewGroup; 

126 importandroid.widget.ArrayAdapter; 

127 importandroid.widget.ImageView; 

128 importandroid.widget.ListView; 

129 importandroid.widget.TextView; 

130   

131 public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> { 

132   

133         private ListView listView; 

134         private AsyncImageLoader asyncImageLoader; 

135   

136         public ImageAndTextListAdapter(Activity activity,List<ImageAndText> imageAndTexts, ListView listView) { 

137             super(activity, 0, imageAndTexts); 

138             this.listView = listView; 

139             asyncImageLoader = new AsyncImageLoader(); 

140         } 

141   

142         public View getView(int position, View convertView,ViewGroup parent) { 

143             Activity activity = (Activity)getContext(); 

144   

145             // Inflate the views fromXML 

146             ViewrowView = convertView; 

147             ViewCacheviewCache; 

148             if (rowView == null) { 

149                 LayoutInflater inflater = activity.getLayoutInflater(); 

150                 rowView =inflater.inflate(R.layout.image_and_text_row, null); 

151                 viewCache = new ViewCache(rowView); 

152                 rowView.setTag(viewCache); 

153             } else { 

154                 viewCache = (ViewCache)rowView.getTag(); 

155             } 

156             ImageAndText imageAndText =getItem(position); 

157   

158             // Load the image and setit on the ImageView 

159             StringimageUrl = imageAndText.getImageUrl(); 

160             ImageViewimageView = viewCache.getImageView(); 

161             imageView.setTag(imageUrl); 

162             DrawablecachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() { 

163                 public void imageLoaded(DrawableimageDrawable, String imageUrl) { 

164                     ImageView imageViewByTag =(ImageView) listView.findViewWithTag(imageUrl); 

165                     if (imageViewByTag != null) { 

166                         imageViewByTag.setImageDrawable(imageDrawable); 

167                     } 

168                 } 

169             }); 

170             if (cachedImage == null) { 

171                 imageView.setImageResource(R.drawable.default_image); 

172             }else{ 

173                 imageView.setImageDrawable(cachedImage); 

174             } 

175             // Set the text on theTextView 

176             TextViewtextView = viewCache.getTextView(); 

177             textView.setText(imageAndText.getText()); 

178   

179             return rowView; 

180         } 

181   

182 } 


ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。

最后贴出布局文件:

Xml代码

183 <?xml version="1.0" encoding="utf-8"?> 

184 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

185               android:orientation="horizontal" 

186               android:layout_width="fill_parent" 

187               android:layout_height="wrap_content"> 

188   

189         <ImageView android:id="@+id/image" 

190                    android:layout_width="wrap_content" 

191                    android:layout_height="wrap_content" 

192                    /> 

193   

194         <TextView android:id="@+id/text" 

195                   android:layout_width="wrap_content" 

196                   android:layout_height="wrap_content"/> 

197   

198 </LinearLayout> 


欢迎访问: www.orietech.com

英文博客: orietech.wordpress.com


生态学家都在用的MixSIAR:用R语言搞定稳定同位素混合模型(从数据整理到结果解读) 本文详细介绍了生态学家常用的MixSIAR工具,通过R语言实现稳定同位素混合模型分析,从数据整理到结果解读全流程。文章涵盖环境准备、模型构建、参数设置、运行诊断及可视化等关键步骤,帮助研究者科学分析河口鱼类食物来源,适用于生态学研究和湿地保护政策制定。 阅读详情

相关推荐

python入门:Anaconda和Jupyter notebook的安装与使用

一、安装和使用Anaconda 1、anaconda是什么? Anaconda在英文中是“巨蟒”的意思,与python的意思相近,它是python的包管理器和环境管理器。 2、为什么需要安装anaconda? 原因有以下几点: 附带一大批常用的数据科学包,方便立即开始处理数据 管理包 anaconda是在conda(一个包管理器和环境管理器)上发展来的;而conda可以很方便地对第三方的包进行安装、卸载和更新。 管理环境 conda可以为不同的项目建立不同的运行环境,避免不同的项目或包版本

PY洋洋 1万+

Android开发之ListView异步加载图片

坚持一件对自己有意义的事。。。

乐于分享,乐于讨论,欢迎大家积极讨论 8840

VirtualBox增强功能安装全指南:从下载到配置复制粘贴功能

本文详细介绍了VirtualBox增强功能的完整安装与配置流程,重点解决了虚拟机与主机间复制粘贴、文件拖放等核心协作难题。通过分步指南和故障排查,帮助用户在不同操作系统(如Windows、Linux)中实现无缝集成,提升虚拟化工作效率与体验。

weixin_29206669的博客 419

listview异步图片加载之优化篇(android)

Listview异步加载之优化篇 关于listview的异步加载,网上其实很多示例了,总体思想差不多,不过很多版本或是有bug,或是有性能问题有待优化。有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索个中奥秘,与诸君共赏… 贴张效果图先: 异步加载图片基本思想: 1.先从内存缓存中获取图片...

weixin_30795127的博客 269

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 298

zynq7020的arm A9核降频实录

zynq arm9 cortex a9 降频

qq_40011737的博客 8765

WPF异步载入图片,附带载入中动画

最近,在做一个WPF项目。项目中有一个需求,就是以列表的方式显示出项目图片。这些图片有的存在于互联网上,有的存在于本地磁盘。存在本地磁盘的文件好说,主要是存在于网络的图片。因为存在于网络的图片,在载入时需要耗费时间,如果直接给Image控件绑定URI属性的话,会造成界面卡顿。为了提供更好的体验,要求有类似网页中图片载入中的特效。 经过两天的研究,我翻看了爱壁纸HD For Window...

weixin_30537391的博客 471

N5105 PVE UEFI核显直通Windows:从黑屏到HDMI输出的实战调优

本文详细介绍了在N5105处理器上实现PVE UEFI核显直通Windows的实战调优方法。针对黑屏和HDMI音频无法识别等常见问题,提供了系统参数调整、驱动模块加载、虚拟机配置等解决方案,帮助用户成功实现核显直通并优化性能。

weixin_42566424的博客 204

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

用到ListView去加载数据,加载图片和文字是比较常见的,文字还好,图片从网络请求加载速度比较慢,以下是一个我在项目中使用到的异步加载图片的解决方案 在应用开发中,经常用到ListView去加载数据,加载图片和文字是比较常见的,文字还好,图片从网络请求加载速度比较慢,所以需要把图片的加载放到另一个线程中去执行,执行完了再更新UI线程。以下列出一个我在项目中使用到的异步加载图片的解决...

weixin_34402090的博客 202

计算机应用数学--第一次作业

中科大 计算机应用数学 第一次作业

一杯水果茶!足矣~ 1329

RK3566-预装APP

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

qq_24093081的博客 702

Android实现ListView异步加载图片

ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好 import java.io.IOException;   import java.io.InputStream;   import java.lang.ref.SoftReference;   import java.net.MalformedURLException;   ...

ThomasKwan的博客 234

使用 Simulink Real-Time 搭建一个完整的实时信号采集与滤波系统模型

本文详细介绍了基于Simulink Real-Time构建实时信号采集与滤波系统的完整流程。主要内容包括:系统配置(模型创建与参数设置)、信号采集模块搭建(模拟信号源或真实硬件连接)、实时滤波器设计(浮点/定点)、输出可视化(Scope/ToWorkspace等)、模型编译与下载到目标机、外部模式在线调试及数据保存方法。系统可实现微秒级实时信号处理,适用于工业控制、航空航天等对时间确定性要求高的场景。文章还提供了优化建议(多速率建模、优先级调度等)和应用场景说明,帮助读者快速掌握实时系统开发的核心技能。

amy_mhd的博客 304

android listview的异步加载,Android实现ListView异步加载图片的方法

本文实例讲述了Android实现ListView异步加载图片的方法。分享给大家供大家参考。具体如下:ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码:package cn.wangmeng.test;import java.io.IOException;import java.io...

weixin_29923451的博客 321

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ListView异步加载图片,完美实现图文混排

昨天参加一个面试,面试官让当场写一个类似于新闻列表的页面,文本数据和图片都从网络上获取,想起我还没写过ListView异步加载图片并实现图文混排效果的文章,so,今天就来写一下,介绍一下经验。ListView加载文本数据都是很简单的,即使是异步获取文本数据。但是异步加载图片就稍微有一点麻烦,既要获得一个比较好的用户体验,还要防止出现图片错位等各种不良BUG,其实要考虑的东西还是挺多的。好了,我们先

江南一点雨的专栏 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android listview图片刷新,Android实现ListView异步加载图片

当listview需要从网络上加载图片的时候,我们就需要考虑用异步加载。我们可以用AsyncTask来解决问题,AsyncTask专门被设计来处理这种情况,但是AsyncTask的缺陷是最多只能同时有10个线程,而listview一次需要显示的图片可能不止10个。因此我们考虑为每一张图片开启一个加载线程,主方法的代码如下:package cn.wangmeng.test;import java.i...

weixin_30938397的博客 191

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android listview图片刷新,Android实现ListView异步加载图片的方法

本文实例讲述了Android实现ListView异步加载图片的方法。分享给大家供大家参考。具体如下:ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码:package cn.wangmeng.test;import java.io.IOException;import java.io...

weixin_30569443的博客 351

Android 如何实现ListView异步加载网络图片

最近公司一个项目要用listview异步加载显示网络图片,在网上找了很多例子,经过总结现在有一些方法供大家学习。1.关于布局文件这里就不在贴代码了。只贴一些主要的代码。2.定义异步加载图片的工具类import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import jav

landmark的专栏 847

android中listView实现异步加载网络图片

<br />ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码:<br />package cn.wangmeng.test;  <br />  <br />import java.io.IOException;  <br />import java.io.InputStream;  <br />import java.lang.ref.SoftReference;  <br />import java.net.

zeng622peng的专栏 4739

Android实现ListView异步加载图片总结

参考自 http://blog.youkuaiyun.com/wanglong0537/article/details/6334005# http://www.cnblogs.com/slider/archive/2011/11/22/2258942.html http://www.iteye.com/topic/685986   ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片

superjunjin的专栏 2303

Android动画异步加载,ListView异步加载图片实现思路

在应用开发中,经常用到ListView去加载数据,加载图片和文字是比较常见的,文字还好,图片从网络请求加载速度比较慢,所以需要把图片的加载放到另一个线程中去执行,执行完了再更新UI线程。以下列出一个我在项目中使用到的异步加载图片的解决方案,代码没有上全,给出核心部分。大致思路是这样:1.利用软引用来缓存图片Bitmap,用图片的URL作为缓存查找的Key;2.设两级缓存,一级是SoftRefere...

weixin_35774446的博客 223
上一篇: Android 开发图片压缩(缩略图)方法
下一篇: Drawable、Bitmap、byte[]之间的转换问题
ORIETech
博客等级 码龄15年 882粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值