设为首页收藏本站

木蚂蚁手机乐园首页

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3309|回复: 8

Android实现ListView异步加载图片

[复制链接]

118

主题

1

帖子

837

积分

木蚂蚁美化组

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
837

幸运之星

发表于 2010-10-30 16:05:05 | 显示全部楼层 |阅读模式
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
  12. class AsyncImageLoader {

  13. private HashMap<String, SoftReference<Drawable>> imageCache;

  14. public AsyncImageLoader() {
  15. imageCache =
  16. new HashMap<String, SoftReference<Drawable>>();
  17. }

  18. public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
  19. if (imageCache.containsKey(imageUrl)) {
  20. SoftReference<Drawable> softReference = imageCache.get(imageUrl);
  21. Drawable drawable = softReference.get();
  22. if (drawable !=
  23. null) {
  24. return drawable;
  25. }
  26. }
  27. final Handler handler =
  28. new Handler() {
  29. public
  30. void handleMessage(Message message) {
  31. imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
  32. }
  33. };
  34. new Thread() {
  35. @Override
  36. public
  37. 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
  45. null;
  46. }

  47. public
  48. static Drawable loadImageFromUrl(String url) {
  49. URL m;
  50. InputStream i =
  51. null;
  52. try {
  53. m =
  54. new URL(url);
  55. i = (InputStream) m.getContent();
  56. } catch (MalformedURLException e1) {
  57. e1.printStackTrace();
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. }
  61. Drawable d = Drawable.createFromStream(i, "src");
  62. return d;
  63. }

  64. public
  65. interface ImageCallback {
  66. public
  67. void imageLoaded(Drawable imageDrawable, String imageUrl);
  68. }

  69. }

复制代码



以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。
几个辅助类文件:
代码
  1. package cn.wangmeng.test;

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

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

复制代码



代码
  1. package cn.wangmeng.test;

  2. import android.view.View;
  3. import android.widget.ImageView;
  4. import android.widget.TextView;

  5. public
  6. class ViewCache {

  7. private View baseView;
  8. private TextView textView;
  9. private ImageView imageView;

  10. public ViewCache(View baseView) {
  11. this.baseView = baseView;
  12. }

  13. public TextView getTextView() {
  14. if (textView ==
  15. null) {
  16. textView = (TextView) baseView.findViewById(R.id.text);
  17. }
  18. return textView;
  19. }

  20. public ImageView getImageView() {
  21. if (imageView ==
  22. null) {
  23. imageView = (ImageView) baseView.findViewById(R.id.image);
  24. }
  25. return imageView;
  26. }

  27. }

复制代码



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
  14. class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> {

  15. private ListView listView;
  16. private AsyncImageLoader asyncImageLoader;

  17. public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listView) {
  18. super(activity, 0, imageAndTexts);
  19. this.listView = listView;
  20. asyncImageLoader =
  21. new AsyncImageLoader();
  22. }

  23. public View getView(int position, View convertView, ViewGroup parent) {
  24. Activity activity = (Activity) getContext();

  25. // Inflate the views from XML
  26. View rowView = convertView;
  27. ViewCache viewCache;
  28. if (rowView ==
  29. null) {
  30. LayoutInflater inflater = activity.getLayoutInflater();
  31. rowView = inflater.inflate(R.layout.image_and_text_row, null);
  32. viewCache =
  33. new ViewCache(rowView);
  34. rowView.setTag(viewCache);
  35. } else {
  36. viewCache = (ViewCache) rowView.getTag();
  37. }
  38. ImageAndText imageAndText = getItem(position);

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

  62. return rowView;
  63. }

  64. }

复制代码



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. androidrientation="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>
复制代码
在人群中生活,有必要保持一定的狼性!
QQ:386367781(仅限技术交流)
Email:dangzhengtao@gmail.com

514

主题

32

帖子

3928

积分

木蚂蚁小学六年级

Rank: 6Rank: 6

积分
3928

社区QQ达人

发表于 2010-10-31 09:21:50 | 显示全部楼层
java代码
开学了............

64

主题

0

帖子

-820

积分

乞丐

积分
-820
发表于 2010-11-14 04:22:11 | 显示全部楼层
围观,路过。无爱:)  

81

主题

0

帖子

403

积分

木蚂蚁小学三年级

Rank: 3

积分
403
发表于 2010-11-16 21:50:57 | 显示全部楼层
我也是每天看贴无数,基本上不回贴.后来发现这样很傻,很多比我注册晚的人积分都比我多,于是我就把这段文字保存在记事本里,每看一贴就复制粘贴一次.顺便帮lz把贴子顶上去!

187

主题

0

帖子

933

积分

木蚂蚁小学四年级

Rank: 4Rank: 4

积分
933
发表于 2010-11-21 02:23:37 | 显示全部楼层
不错支持了

158

主题

0

帖子

-330

积分

乞丐

积分
-330
发表于 2010-11-25 23:36:14 | 显示全部楼层
下载试用,试试

0

主题

45

帖子

90

积分

木蚂蚁小学一年级

Rank: 1

积分
90
发表于 2012-7-23 20:28:18 | 显示全部楼层
楼主,可以把源码放上去吗?
回复 支持 反对

使用道具 举报

0

主题

1万

帖子

2万

积分

木蚂蚁高中一年级

Rank: 10Rank: 10

积分
29046
发表于 2017-11-11 17:20:23 | 显示全部楼层
谢谢分享了!
回复 支持 反对

使用道具 举报

0

主题

1万

帖子

2万

积分

木蚂蚁高中一年级

Rank: 10Rank: 10

积分
29046
发表于 2017-11-14 10:05:10 | 显示全部楼层
回个帖子支持一下!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐版块: PC破解软件下载  |   VR视频资源下载  |   三星Galaxy S8/S8+  |   恋舞OL  |   安卓破解软件  |   安卓破解游戏     安卓汉化下载  
安卓android软件大全  |   安卓大型游戏  |   小米手机论坛  |   三星Galaxy Note8论坛  |   影视资源下载  |   安卓破解    
安卓市场   安卓软件   小说电子书大全   在线影音播放   PC破解游戏下载   安卓软件教程   安卓游戏攻略   手机游戏   手机健康软件   手机订餐软件   手机购物软件   热门TAG
快速回复 返回顶部 返回列表