Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android實現ListView異步加載圖片

Android實現ListView異步加載圖片

編輯:初級開發

ListVIEw異步加載圖片是非常實用的方法,凡是是要通過網絡獲取圖片資源一般使用這種方法比較好,用戶體驗好,下面就說實現方法,先貼上主方法的代碼:
  1. package cn.wangmeng.test;
     

  2.  
  3. import Java.io.IOException;
     
  4. import Java.io.InputStream;
     
  5. import Java.lang.ref.SoftReference;
     
  6. import Java.Net.MalformedURLException;
     
  7. import Java.Net.URL;
     
  8. import Java.util.HashMap;
     

  9.  
  10. import android.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(Message message) {
     
  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 Drawable loadImageFromUrl(String url) {
     
  48.                         URL m;
     
  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.                         Drawable d = Drawable.createFromStream(i, "src");
     
  59.                         return d;
     
  60.                 }
     
  61.           
     
  62.              public interface ImageCallback {
     
  63.                  public void imageLoaded(Drawable imageDrawable, String imageUrl);
     
  64.              }
     

  65.  
  66. }
以上代碼是實現異步獲取圖片的主方法,SoftReference是軟引用,是為了更好的為了系統回收變量,重復的URL直接返回已有的資源,實現回調函數,讓數據成功後,更新到UI線程。 
幾個輔助類文件:
  1. package cn.wangmeng.test;
     

  2.  
  3. public class ImageAndText {
     
  4.             private String imageUrl;
     
  5.             private String text;
     

  6.  
  7.             public ImageAndText(String imageUrl, String text) {
     
  8.                 this.imageUrl = imageUrl;
     
  9.                 this.text = text;
     
  10.             }
     
  11.             public String getImageUrl() {
     
  12.                 return imageUrl;
     
  13.             }
     
  14.             public String getText() {
     
  15.                 return text;
     
  16.             }
     
  17. }
  1. package cn.wangmeng.test;
     

  2.  
  3. import android.view.VIEw;
     
  4. import android.widget.ImageVIEw;
     
  5. import android.widget.TextVIEw;
     

  6.  
  7. public class VIEwCache {
     

  8.  
  9.             private View baseVIEw;
     
  10.             private TextView textVIEw;
     
  11.             private ImageView imageVIEw;
     

  12.  
  13.             public ViewCache(View baseVIEw) {
     
  14.                 this.baseView = baseVIEw;
     
  15.             }
     

  16.  
  17.             public TextView getTextVIEw() {
     
  18.                 if (textVIEw == null) {
     
  19.                     textView = (TextView) baseView.findVIEwById(R.id.text);
     
  20.                 }
     
  21.                 return textVIEw;
     
  22.             }
     

  23.  
  24.             public ImageView getImageVIEw() {
     
  25.                 if (imageVIEw == null) {
     
  26.                     imageView = (ImageView) baseView.findVIEwById(R.id.image);
     
  27.                 }
     
  28.                 return imageVIEw;
     
  29.             }
     

  30.  
  31. }
VIEwCache是輔助獲取adapter的子元素布局
  1. package cn.wangmeng.test;
     

  2.  
  3. import Java.util.List;
     

  4.  
  5. import cn.wangmeng.test.AsyncImageLoader.ImageCallback;
     

  6.  
  7. import android.app.Activity;
     
  8. import android.graphics.drawable.Drawable;
     
  9. import android.vIEw.LayoutInflater;
     
  10. import android.view.VIEw;
     
  11. import android.view.VIEwGroup;
     
  12. import android.widget.ArrayAdapter;
     
  13. import android.widget.ImageVIEw;
     
  14. import android.widget.ListVIEw;
     
  15. import android.widget.TextVIEw;
     

  16.  
  17. public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> {
     

  18.  
  19.             private ListView listVIEw;
     
  20.             private AsyncImageLoader asyncImageLoader;
     

  21.  
  22.             public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listVIEw) {
     
  23.                 super(activity, 0, imageAndTexts);
     
  24.                 this.listView = listVIEw;
     
  25.                 asyncImageLoader = new AsyncImageLoader();
     
  26.             }
     

  27.  
  28.             public View getView(int position, View convertView, VIEwGroup parent) {
     
  29.                 Activity activity = (Activity) getContext();
     

  30.  
  31.                 // Inflate the vIEws from XML
     
  32.                 View rowView = convertVIEw;
     
  33.                 ViewCache vIEwCache;
     
  34.                 if (rowVIEw == null) {
     
  35.                     LayoutInflater inflater = activity.getLayoutInflater();
     
  36.                     rowVIEw = inflater.inflate(R.layout.image_and_text_row, null);
     
  37.                     viewCache = new ViewCache(rowVIEw);
     
  38.                     rowView.setTag(vIEwCache);
     
  39.                 } else {
     
  40.                     viewCache = (ViewCache) rowVIEw.getTag();
     
  41.                 }
     
  42.                 ImageAndText imageAndText = getItem(position);
     

  43.  
  44.                 // Load the image and set it on the ImageVIEw
     
  45.                 String imageUrl = imageAndText.getImageUrl();
     
  46.                 ImageView imageView = viewCache.getImageVIEw();
     
  47.                 imageVIEw.setTag(imageUrl);
     
  48.                 Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {
     
  49.                     public void imageLoaded(Drawable imageDrawable, String imageUrl) {
     
  50.                         ImageView imageViewByTag = (ImageView) listView.findVIEwWithTag(imageUrl);
     
  51.                         if (imageVIEwByTag != null) {
     
  52.                             imageVIEwByTag.setImageDrawable(imageDrawable);
     
  53.                         }
     
  54.                     }
     
  55.                 });
     
  56.                         if (cachedImage == null) {
     
  57.                                 imageVIEw.setImageResource(R.drawable.default_image);
     
  58.                         }else{
     
  59.                                 imageVIEw.setImageDrawable(cachedImage);
     
  60.                         }
     
  61.                 // Set the text on the TextVIEw
     
  62.                 TextView textView = viewCache.getTextVIEw();
     
  63.                 textVIEw.setText(imageAndText.getText());
     

  64.  
  65.                 return rowVIEw;
     
  66.             }
     

  67.  
  68. }
mageAndTextListAdapter是實現ListView的Adapter,裡面有個技巧就是imageVIEw.setTag(imageUrl),setTag是存儲數據的,這樣是為了保證在回調函數時,listvIEw去更新自己對應item,大家仔細閱讀就知道了。 
最後貼出布局文件:
  1. <?XML version="1.0" encoding="utf-8"?>
     
  2. <LinearLayout XMLns:android="http://schemas.android.com/apk/res/android"
     
  3.               android:orIEntation="horizontal"
     
  4.               android:layout_width="fill_parent"
     
  5.               android:layout_height="wrap_content">
     

  6.  
  7.         <ImageVIEw android:id="@+id/image"
     
  8.                    android:layout_width="wrap_content"
     
  9.                    android:layout_height="wrap_content"
     
  10.                    />
     

  11.  
  12.         <TextVIEw android:id="@+id/text"
     
  13.                   android:layout_width="wrap_content"
     
  14.                   android:layout_height="wrap_content"/>
     

  15.  
  16. </LinearLayout>
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved