异步加载图片栈类

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使用HttpURLConnection显示网络图片
  2. android加载进度条
  3. android 加载 网络图片
  4. Android 拖拽图片
  5. Android使用URLConnection显示网络图片
  6. android中异步加载图片信息
  7. android图片拖动

随机推荐

  1. Android(安卓)编辑框(EditText)属性
  2. Android(安卓)性能优化的一些方法
  3. android 电池(三):android电池系统
  4. 学习01:Android(安卓)4.0_你必须知道的13
  5. Android异步处理三:Handler+Looper+Messag
  6. Android:控件GridView的使用
  7. Android(安卓)app项目和开发总结
  8. Android下实现手机验证码
  9. Android(安卓)中Edittext属性集合
  10. 简单实现跑马灯