您的位置:首页 > 理论基础 > 计算机网络

Android ListView异步加载网络图片

2015-04-29 21:52 337 查看
使用异步类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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: