zoukankan      html  css  js  c++  java
  • Android ListView异步加载网络图片

    异步加载图片栈类

    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为记录标识,标识是那条记录iamge
    	public 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() {
    			@Override
    			public void run() {
    				super.run();
    				//加载图片
    				Drawable drawable = AsyncImageTask.loadImageByUrl(imageUrl);
    				//加入缓存集合中
    				imageMap.put(imageUrl, drawable);
    				//通知消息队列更新UI
    				Message message = handler.obtainMessage(0, drawable);
    				handler.sendMessage(message);
    			}
    		}.start();
    		return null;
    	}
    	//根据图片地址加载图片,并保存为Drawable
    	public 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;
    	}
    	//利用借口回调,更新图片UI
    	public 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();
    	}
    
    	@Override
    	public int getCount() {
    		return list.size();
    	}
    
    	@Override
    	public Object getItem(int position) {
    		return position;
    	}
    
    	@Override
    	public long getItemId(int position) {
    		return position;
    	}
    
    	@Override
    	public 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() {
    					@Override
    					public 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异步加载源码


  • 相关阅读:
    TCP/IP协议详解
    linux高性能服务器编程--初见
    聚合类
    类class 2
    继承
    构造函数再探
    静态成员与友元
    MySQL图形工具SQLyog破解版
    MySQL注释符号
    数据库中多对多关系的中间表的命名规则
  • 原文地址:https://www.cnblogs.com/yht520/p/3589676.html
Copyright © 2011-2022 走看看