异步加载图片栈类

package com.async.util;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.util.HashMap;import java.util.Map;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;//异步加载图片栈类public class AsyncImageTask {//缓存图片private Map<String, Drawable> imageMap;public AsyncImageTask() {super();this.imageMap = new HashMap<String, Drawable>();}// ID为记录标识,标识是那条记录iamgepublic Drawable loadImage(final int id, final String imageUrl,final ImageCallback callback) {//查看缓存内是否已经加载过此图片if (imageMap.containsKey(imageUrl)) {Drawable drawable = imageMap.get(imageUrl);if (drawable != null) {return drawable;}}//更新图片UI的消息队列final Handler handler = new Handler() {public void handleMessage(Message message) {callback.imageLoaded((Drawable) message.obj, id);}};//加载图片的线程new Thread() {@Overridepublic void run() {super.run();//加载图片Drawable drawable = AsyncImageTask.loadImageByUrl(imageUrl);//加入缓存集合中imageMap.put(imageUrl, drawable);//通知消息队列更新UIMessage message = handler.obtainMessage(0, drawable);handler.sendMessage(message);}}.start();return null;}//根据图片地址加载图片,并保存为Drawablepublic static Drawable loadImageByUrl(String imageUrl) {URL url = null;InputStream inputStream = null;try {url = new URL(imageUrl);inputStream = (InputStream) url.getContent();return Drawable.createFromStream(inputStream, "src");} catch (Exception e) {e.printStackTrace();} finally {try {if (inputStream != null) {inputStream.close();}} catch (IOException e) {e.printStackTrace();}}return null;}//利用借口回调,更新图片UIpublic interface ImageCallback {public void imageLoaded(Drawable image, int id);}}

适配器类:

package com.alarm.adapter;import java.util.List;import com.alarm.activity.R;import com.alarm.controls.AsyncImageTask;import com.alarm.controls.AsyncImageTask.ImageCallback;import com.alarm.model.Topic;import android.content.Context;import android.graphics.drawable.Drawable;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class TopicsAdapter extends BaseAdapter {private List<Topic> list;private LayoutInflater inflater;private ListView listView;private AsyncImageTask imageTask;public TopicsAdapter(ListView listView, Context c, List<Topic> list) {super();this.list = list;this.listView = listView;inflater = LayoutInflater.from(c);imageTask = new AsyncImageTask();}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = new ViewHolder();if (convertView == null) {convertView = inflater.inflate(R.layout.topic_item, null);holder.mainBg = (ImageView) convertView.findViewById(R.id.main_bg);holder.note = (TextView) convertView.findViewById(R.id.memo);holder.name = (TextView) convertView.findViewById(R.id.name);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}// 标记图片视图,注意不能放在上面holder.mainBg.setTag(position);Topic topic = list.get(position);//获取图片Drawable drawable = imageTask.loadImage(position, topic.mainBg,new ImageCallback() {@Overridepublic void imageLoaded(Drawable image, int id) {if (image != null) { //重点,获取刚才标识的组件,并更新 ImageView mainBg = (ImageView) listView.findViewWithTag(id);if (mainBg != null) {mainBg.setImageDrawable(image);}}}});if (drawable != null) {holder.mainBg.setImageDrawable(drawable);} else {holder.mainBg.setImageResource(R.color.main_bg);}holder.note.setText(topic.note);holder.name.setText(topic.name);return convertView;}class ViewHolder {ImageView mainBg;TextView note;TextView name;}}


ListView异步加载源码


更多相关文章

  1. android 多点触摸实现图片缩放
  2. android如何往SDCard中存取图片
  3. android:注册时的协议---》方法一:弹出框
  4. android图片拖动
  5. Android(安卓)拖拽图片
  6. android 加载 网络图片
  7. Android使用URLConnection显示网络图片
  8. android图形验证码
  9. android API Demo之使用ViewFlipper制作轮播广告

随机推荐

  1. Fiddler抓取Android真机上的HTTPS包
  2. android获取已安装应用的安装包
  3. android读SDCard中txt文件中文乱码问题
  4. UI效果(9): 屏幕相关操作
  5. Android应用程序需不需要手动退出? - 阿智
  6. HD文件管理器 v0.1.3----- 一款界面简约,
  7. Android异步任务的使用方法
  8. android 自动检测版本升级
  9. Android切近实战(八)
  10. Android分享到微信好友、朋友圈