首页 > 系统 > Android > 正文

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

2019-10-24 20:36:01
字体:
来源:转载
供稿:网友

这篇文章主要介绍了Android实现ListView异步加载图片的方法,以实例形式较为详细的分析了Android中ListView异步加载图片的原理与相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Android实现ListView异步加载图片的方法。分享给大家供大家参考。具体如下:

ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码:

 

 
  1. package cn.wangmeng.test; 
  2. import java.io.IOException; 
  3. import java.io.InputStream; 
  4. import java.lang.ref.SoftReference; 
  5. import java.net.MalformedURLException; 
  6. import java.net.URL; 
  7. import java.util.HashMap; 
  8. import android.graphics.drawable.Drawable; 
  9. import android.os.Handler; 
  10. import android.os.Message; 
  11. public class AsyncImageLoader { 
  12. private HashMap<String, SoftReference<Drawable>> imageCache; 
  13. public AsyncImageLoader() { 
  14. imageCache = new HashMap<String, SoftReference<Drawable>>(); 
  15. public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) { 
  16. if (imageCache.containsKey(imageUrl)) { 
  17. SoftReference<Drawable> softReference = imageCache.get(imageUrl); 
  18. Drawable drawable = softReference.get(); 
  19. if (drawable != null) { 
  20. return drawable; 
  21. final Handler handler = new Handler() { 
  22. public void handleMessage(Message message) { 
  23. imageCallback.imageLoaded((Drawable) message.obj, imageUrl); 
  24. }; 
  25. new Thread() { 
  26. @Override 
  27. public void run() { 
  28. Drawable drawable = loadImageFromUrl(imageUrl); 
  29. imageCache.put(imageUrl, new SoftReference<Drawable>(drawable)); 
  30. Message message = handler.obtainMessage(0, drawable); 
  31. handler.sendMessage(message); 
  32. }.start(); 
  33. return null
  34. public static Drawable loadImageFromUrl(String url) { 
  35. URL m; 
  36. InputStream i = null
  37. try { 
  38. m = new URL(url); 
  39. i = (InputStream) m.getContent(); 
  40. catch (MalformedURLException e1) { 
  41. e1.printStackTrace(); 
  42. catch (IOException e) { 
  43. e.printStackTrace(); 
  44. Drawable d = Drawable.createFromStream(i, "src"); 
  45. return d; 
  46. public interface ImageCallback { 
  47. public void imageLoaded(Drawable imageDrawable, String imageUrl); 

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

几个辅助类文件:

 

 
  1. package cn.wangmeng.test; 
  2. public class ImageAndText { 
  3. private String imageUrl; 
  4. private String text; 
  5. public ImageAndText(String imageUrl, String text) { 
  6. this.imageUrl = imageUrl; 
  7. this.text = text; 
  8. public String getImageUrl() { 
  9. return imageUrl; 
  10. public String getText() { 
  11. return text; 

 

 
  1. package cn.wangmeng.test; 
  2. import android.view.View; 
  3. import android.widget.ImageView; 
  4. import android.widget.TextView; 
  5. public class ViewCache { 
  6. private View baseView; 
  7. private TextView textView; 
  8. private ImageView imageView; 
  9. public ViewCache(View baseView) { 
  10. this.baseView = baseView; 
  11. public TextView getTextView() { 
  12. if (textView == null) { 
  13. textView = (TextView) baseView.findViewById(R.id.text); 
  14. return textView; 
  15. public ImageView getImageView() { 
  16. if (imageView == null) { 
  17. imageView = (ImageView) baseView.findViewById(R.id.image); 
  18. return imageView; 

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

 

 
  1. package cn.wangmeng.test; 
  2. import java.util.List; 
  3. import cn.wangmeng.test.AsyncImageLoader.ImageCallback; 
  4. import android.app.Activity; 
  5. import android.graphics.drawable.Drawable; 
  6. import android.view.LayoutInflater; 
  7. import android.view.View; 
  8. import android.view.ViewGroup; 
  9. import android.widget.ArrayAdapter; 
  10. import android.widget.ImageView; 
  11. import android.widget.ListView; 
  12. import android.widget.TextView; 
  13. public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> { 
  14. private ListView listView; 
  15. private AsyncImageLoader asyncImageLoader; 
  16. public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listView) { 
  17. super(activity, 0, imageAndTexts); 
  18. this.listView = listView; 
  19. asyncImageLoader = new AsyncImageLoader(); 
  20. public View getView(int position, View convertView, ViewGroup parent) { 
  21. Activity activity = (Activity) getContext(); 
  22. // Inflate the views from XML 
  23. View rowView = convertView; 
  24. ViewCache viewCache; 
  25. if (rowView == null) { 
  26. LayoutInflater inflater = activity.getLayoutInflater(); 
  27. rowView = inflater.inflate(R.layout.image_and_text_row, null); 
  28. viewCache = new ViewCache(rowView); 
  29. rowView.setTag(viewCache); 
  30. else { 
  31. viewCache = (ViewCache) rowView.getTag(); 
  32. ImageAndText imageAndText = getItem(position); 
  33. // Load the image and set it on the ImageView 
  34. String imageUrl = imageAndText.getImageUrl(); 
  35. ImageView imageView = viewCache.getImageView(); 
  36. imageView.setTag(imageUrl); 
  37. Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() { 
  38. public void imageLoaded(Drawable imageDrawable, String imageUrl) { 
  39. ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl); 
  40. if (imageViewByTag != null) { 
  41. imageViewByTag.setImageDrawable(imageDrawable); 
  42. }); 
  43. if (cachedImage == null) { 
  44. imageView.setImageResource(R.drawable.default_image); 
  45. }else
  46. imageView.setImageDrawable(cachedImage); 
  47. // Set the text on the TextView 
  48. TextView textView = viewCache.getTextView(); 
  49. textView.setText(imageAndText.getText()); 
  50. return rowView; 

ImageAndTextListAdapter是实现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. <ImageView android:id="@+id/image" 
  7. android:layout_width="wrap_content" 
  8. android:layout_height="wrap_content" 
  9. /> 
  10. <TextView android:id="@+id/text" 
  11. android:layout_width="wrap_content" 
  12. android:layout_height="wrap_content"/> 
  13. </LinearLayout> 

运行效果截图如下:

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

希望本文所述对大家的C#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表