Android ListView异步加载网络图片

使用异步类AsyncTack。

异步加载图片栈类

  1. package com.async.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.net.URL;  
  6. import java.util.HashMap;  
  7. import java.util.Map;  
  8.   
  9. import android.graphics.drawable.Drawable;  
  10. import android.os.Handler;  
  11. import android.os.Message;  
  12.   
  13.   
  14. //异步加载图片栈类  
  15. public class AsyncImageTask {  
  16.     //缓存图片  
  17.     private Map<String, Drawable> imageMap;  
  18.   
  19.     public AsyncImageTask() {  
  20.         super();  
  21.         this.imageMap = new HashMap<String, Drawable>();  
  22.     }  
  23.   
  24.     // ID为记录标识,标识是那条记录iamge  
  25.     public Drawable loadImage(final int id, final String imageUrl,  
  26.             final ImageCallback callback) {  
  27.         //查看缓存内是否已经加载过此图片  
  28.         if (imageMap.containsKey(imageUrl)) {  
  29.             Drawable drawable = imageMap.get(imageUrl);  
  30.             if (drawable != null) {  
  31.                 return drawable;  
  32.             }  
  33.         }  
  34.         //更新图片UI的消息队列  
  35.         final Handler handler = new Handler() {  
  36.             public void handleMessage(Message message) {  
  37.                 callback.imageLoaded((Drawable) message.obj, id);  
  38.             }  
  39.         };  
  40.         //加载图片的线程  
  41.         new Thread() {  
  42.             @Override  
  43.             public void run() {  
  44.                 super.run();  
  45.                 //加载图片  
  46.                 Drawable drawable = AsyncImageTask.loadImageByUrl(imageUrl);  
  47.                 //加入缓存集合中  
  48.                 imageMap.put(imageUrl, drawable);  
  49.                 //通知消息队列更新UI  
  50.                 Message message = handler.obtainMessage(0, drawable);  
  51.                 handler.sendMessage(message);  
  52.             }  
  53.         }.start();  
  54.         return null;  
  55.     }  
  56.     //根据图片地址加载图片,并保存为Drawable  
  57.     public static Drawable loadImageByUrl(String imageUrl) {  
  58.   
  59.         URL url = null;  
  60.         InputStream inputStream = null;  
  61.         try {  
  62.             url = new URL(imageUrl);  
  63.             inputStream = (InputStream) url.getContent();  
  64.             return Drawable.createFromStream(inputStream, "src");  
  65.         } catch (Exception e) {  
  66.             e.printStackTrace();  
  67.         } finally {  
  68.             try {  
  69.                 if (inputStream != null) {  
  70.                     inputStream.close();  
  71.                 }  
  72.             } catch (IOException e) {  
  73.                 e.printStackTrace();  
  74.             }  
  75.         }  
  76.         return null;  
  77.     }  
  78.     //利用借口回调,更新图片UI  
  79.     public interface ImageCallback {  
  80.         public void imageLoaded(Drawable image, int id);  
  81.     }  
  82. }

适配器类:

  1. <span style="font-size:18px;color:FFFF00">
  2. package com.alarm.adapter;  
  3.   
  4. import java.util.List;  
  5.   
  6. import com.alarm.activity.R;  
  7. import com.alarm.controls.AsyncImageTask;  
  8. import com.alarm.controls.AsyncImageTask.ImageCallback;  
  9. import com.alarm.model.Topic;  
  10.   
  11. import android.content.Context;  
  12. import android.graphics.drawable.Drawable;  
  13. import android.view.LayoutInflater;  
  14. import android.view.View;  
  15. import android.view.ViewGroup;  
  16. import android.widget.BaseAdapter;  
  17. import android.widget.ImageView;  
  18. import android.widget.ListView;  
  19. import android.widget.TextView;  
  20.   
  21. public class TopicsAdapter extends BaseAdapter {  
  22.     private List<Topic> list;  
  23.     private LayoutInflater inflater;  
  24.     private ListView listView;  
  25.     private AsyncImageTask imageTask;  
  26.   
  27.     public TopicsAdapter(ListView listView, Context c, List<Topic> list) {  
  28.         super();  
  29.         this.list = list;  
  30.         this.listView = listView;  
  31.         inflater = LayoutInflater.from(c);  
  32.         imageTask = new AsyncImageTask();  
  33.     }  
  34.   
  35.     @Override  
  36.     public int getCount() {  
  37.         return list.size();  
  38.     }  
  39.   
  40.     @Override  
  41.     public Object getItem(int position) {  
  42.         return position;  
  43.     }  
  44.   
  45.     @Override  
  46.     public long getItemId(int position) {  
  47.         return position;  
  48.     }  
  49.   
  50.     @Override  
  51.     public View getView(int position, View convertView, ViewGroup parent) {  
  52.         ViewHolder holder = new ViewHolder();  
  53.         if (convertView == null) {  
  54.             convertView = inflater.inflate(R.layout.topic_item, null);  
  55.             holder.mainBg = (ImageView) convertView.findViewById(R.id.main_bg);  
  56.             holder.note = (TextView) convertView.findViewById(R.id.memo);  
  57.             holder.name = (TextView) convertView.findViewById(R.id.name);  
  58.             convertView.setTag(holder);  
  59.         } else {  
  60.             holder = (ViewHolder) convertView.getTag();  
  61.         }  
  62.         // 标记图片视图,注意不能放在上面  
  63.         holder.mainBg.setTag(position);  
  64.         Topic topic = list.get(position);  
  65.         //获取图片  
  66.         Drawable drawable = imageTask.loadImage(position, topic.mainBg,  
  67.                 new ImageCallback() {  
  68.                     @Override  
  69.                     public void imageLoaded(Drawable image, int id) {  
  70.                         if (image != null) {  
  71.                              //重点,获取刚才标识的组件,并更新   
  72.                             ImageView mainBg = (ImageView) listView  
  73.                                     .findViewWithTag(id);  
  74.                             if (mainBg != null) {  
  75.                                 mainBg.setImageDrawable(image);  
  76.                             }  
  77.                         }  
  78.                     }  
  79.                 });  
  80.         if (drawable != null) {  
  81.             holder.mainBg.setImageDrawable(drawable);  
  82.         } else {  
  83.             holder.mainBg.setImageResource(R.color.main_bg);  
  84.         }  
  85.         holder.note.setText(topic.note);  
  86.         holder.name.setText(topic.name);  
  87.         return convertView;  
  88.     }  
  89.   
  90.     class ViewHolder {  
  91.         ImageView mainBg;  
  92.         TextView note;  
  93.         TextView name;  
  94.     }  
  95.   
  96. }</span>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值