ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码:
- packagecn.wangmeng.test;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.lang.ref.SoftReference;
- importjava.net.MalformedURLException;
- importjava.net.URL;
- importjava.util.HashMap;
- importandroid.graphics.drawable.Drawable;
- importandroid.os.Handler;
- importandroid.os.Message;
- publicclassAsyncImageLoader{
- privateHashMap<String,SoftReference<Drawable>>imageCache;
- publicAsyncImageLoader(){
- imageCache=newHashMap<String,SoftReference<Drawable>>();
- }
- publicDrawableloadDrawable(finalStringimageUrl,finalImageCallbackimageCallback){
- if(imageCache.containsKey(imageUrl)){
- SoftReference<Drawable>softReference=imageCache.get(imageUrl);
- Drawabledrawable=softReference.get();
- if(drawable!=null){
- returndrawable;
- }
- }
- finalHandlerhandler=newHandler(){
- publicvoidhandleMessage(Messagemessage){
- imageCallback.imageLoaded((Drawable)message.obj,imageUrl);
- }
- };
- newThread(){
- @Override
- publicvoidrun(){
- Drawabledrawable=loadImageFromUrl(imageUrl);
- imageCache.put(imageUrl,newSoftReference<Drawable>(drawable));
- Messagemessage=handler.obtainMessage(0,drawable);
- handler.sendMessage(message);
- }
- }.start();
- returnnull;
- }
- publicstaticDrawableloadImageFromUrl(Stringurl){
- URLm;
- InputStreami=null;
- try{
- m=newURL(url);
- i=(InputStream)m.getContent();
- }catch(MalformedURLExceptione1){
- e1.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- Drawabled=Drawable.createFromStream(i,"src");
- returnd;
- }
- publicinterfaceImageCallback{
- publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl);
- }
- }
以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。
几个辅助类文件:
- packagecn.wangmeng.test;
- publicclassImageAndText{
- privateStringimageUrl;
- privateStringtext;
- publicImageAndText(StringimageUrl,Stringtext){
- this.imageUrl=imageUrl;
- this.text=text;
- }
- publicStringgetImageUrl(){
- returnimageUrl;
- }
- publicStringgetText(){
- returntext;
- }
- }
- packagecn.wangmeng.test;
- importandroid.view.View;
- importandroid.widget.ImageView;
- importandroid.widget.TextView;
- publicclassViewCache{
- privateViewbaseView;
- privateTextViewtextView;
- privateImageViewimageView;
- publicViewCache(ViewbaseView){
- this.baseView=baseView;
- }
- publicTextViewgetTextView(){
- if(textView==null){
- textView=(TextView)baseView.findViewById(R.id.text);
- }
- returntextView;
- }
- publicImageViewgetImageView(){
- if(imageView==null){
- imageView=(ImageView)baseView.findViewById(R.id.image);
- }
- returnimageView;
- }
- }
ViewCache是辅助获取adapter的子元素布局
- packagecn.wangmeng.test;
- importjava.util.List;
- importcn.wangmeng.test.AsyncImageLoader.ImageCallback;
- importandroid.app.Activity;
- importandroid.graphics.drawable.Drawable;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.ArrayAdapter;
- importandroid.widget.ImageView;
- importandroid.widget.ListView;
- importandroid.widget.TextView;
- publicclassImageAndTextListAdapterextendsArrayAdapter<ImageAndText>{
- privateListViewlistView;
- privateAsyncImageLoaderasyncImageLoader;
- publicImageAndTextListAdapter(Activityactivity,List<ImageAndText>imageAndTexts,ListViewlistView){
- super(activity,0,imageAndTexts);
- this.listView=listView;
- asyncImageLoader=newAsyncImageLoader();
- }
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- Activityactivity=(Activity)getContext();
- ViewrowView=convertView;
- ViewCacheviewCache;
- if(rowView==null){
- LayoutInflaterinflater=activity.getLayoutInflater();
- rowView=inflater.inflate(R.layout.image_and_text_row,null);
- viewCache=newViewCache(rowView);
- rowView.setTag(viewCache);
- }else{
- viewCache=(ViewCache)rowView.getTag();
- }
- ImageAndTextimageAndText=getItem(position);
- StringimageUrl=imageAndText.getImageUrl();
- ImageViewimageView=viewCache.getImageView();
- imageView.setTag(imageUrl);
- DrawablecachedImage=asyncImageLoader.loadDrawable(imageUrl,newImageCallback(){
- publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl){
- ImageViewimageViewByTag=(ImageView)listView.findViewWithTag(imageUrl);
- if(imageViewByTag!=null){
- imageViewByTag.setImageDrawable(imageDrawable);
- }
- }
- });
- if(cachedImage==null){
- imageView.setImageResource(R.drawable.default_image);
- }else{
- imageView.setImageDrawable(cachedImage);
- }
- TextViewtextView=viewCache.getTextView();
- textView.setText(imageAndText.getText());
- returnrowView;
- }
- }
ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。
最后贴出布局文件:
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageViewandroid:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- <TextViewandroid:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </LinearLayout>
分享到:
相关推荐
本文实例讲述了Android实现ListView异步加载图片的方法。分享给大家供大家参考。具体如下: ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户...
Android Listview异步加载图片,图片错位解决方案
Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...
android listview异步加载图片实例 用到了线程池 下载的图片会保存到本地 并在数据库中保留记录 再次加载时会直接从本地读取
android listView图片异步加载(拖动时不加载,双缓存)
android中ListView异步加载图片时的图片错位问题解决方案
本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法。分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片、店名、活动详情、地址、电话和...
android listview 异步加载网络图片
android中ListView异步加载图片时的图片错位问题解决方案
NULL 博文链接:https://zjingye.iteye.com/blog/1936268
①ListView异步加载图片的方式 ②给ImageView设置Tag,解决图片覆盖问题 ③采用LruCache缓存已经加载过的图片 ④当ListView滚动时不加载图片,滚动停止时才加载图片,从而达到ListView滑动很流畅的效果 ⑤当...
Android ListView 异步加载图片,一点也不卡,使用AsyncTask和WeakReference,注释详尽
Android ListView异步加载图片,优化滚动效果,不卡顿、流畅显示。主要给新人了解ListView和AsyncTask、Json等使用。
AystnPicture_Android ListView异步加载图片.rar
Android中ListView全面完美的网络图片的异步加载,两种加载方式,利用了LruCache缓存,动态加载,只加载可见部分的图片.