使用异步类AsyncTack。
异步加载图片栈类
- 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);
- }
- }
适配器类:
- <span style="font-size:18px;color:FFFF00">
- 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;
- }
- }</span>