今天老师讲了这个,主要是用了缓存的思想,若url相同,则说明已经下载过了,就在缓存里获取drawable对象,不用联网获取解析了
ListView显示图片,是使用了ArrayAdapter去重写getView方法去显示。
MainActivity文件:
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ListAdapter;
public class MainActivity extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
User user1 = new User();
user1.setName("zhangsan");
user1.setImage("http://app.qlogo.cn/mbloghead/cfc3937f7027c57977ee/50");
User user2 = new User();
user2.setName("lisi");
user2.setImage("http://app.qlogo.cn/mbloghead/d998dea66f2b5c3b6e74/50");
User user3 = new User();
user3.setName("wangwu");
user3.setImage("http://app.qlogo.cn/mbloghead/7e18bb72211a5a4b2060/50");
User user4 = new User();
user4.setName("aaa");
user4.setImage("http://app.qlogo.cn/mbloghead/7e18bb72211a5a4b2060/50");
User user5 = new User();
user5.setName("aaa");
user5.setImage("http://app.qlogo.cn/mbloghead/7e18bb72211a5a4b2060/50");
User user6 = new User();
user6.setName("aaa");
user6.setImage("http://app.qlogo.cn/mbloghead/7e18bb72211a5a4b2060/50");
List<User> users = new ArrayList<User>();
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
users.add(user5);
users.add(user6);
ListAdapter adapter = new MyImageAndTextListAdapter(this, users);
getListView().setAdapter(adapter);
}
}
MyImageAndTextListAdapter文件:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyImageAndTextListAdapter extends ArrayAdapter<User> {
public MyImageAndTextListAdapter(Context context,
List<User> newsList) {
super(context, 0, newsList);
}
private AsyncImageLoader imageLoader = new AsyncImageLoader();
private Map<Integer, View> viewMap = new HashMap<Integer, View>();
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = this.viewMap.get(position);
if (rowView == null) {
LayoutInflater inflater = ((Activity) this.getContext())
.getLayoutInflater();
rowView = inflater.inflate(R.layout.item, null);
User user = this.getItem(position);
TextView textView = (TextView) rowView.findViewById(R.id.name);
textView.setText(user.getName());
final ImageView imageView = (ImageView) rowView
.findViewById(R.id.iamgeViewId);
Drawable drawable = imageLoader.loadDrawable(user.getImage(), new AsyncImageLoader.ImageCallback() {
public void imageLoaded(Drawable imageDrawable) {
imageView.setImageDrawable(imageDrawable);
}
});
if(drawable != null){
imageView.setImageDrawable(drawable);
}
viewMap.put(position, rowView);
}
return rowView;
}
}
import java.lang.ref.SoftReference;
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 AsyncImageLoader {
private Map<String, SoftReference<Drawable>> imageCache=new HashMap<String, SoftReference<Drawable>>();
public Drawable loadDrawable(final String imageUrl,final ImageCallback callback){
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference=imageCache.get(imageUrl);
if(softReference.get()!=null){
return softReference.get();
}
}
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
callback.imageLoaded((Drawable) msg.obj);
}
};
new Thread(){
public void run() {
Drawable drawable=loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
handler.sendMessage(handler.obtainMessage(0,drawable));
};
}.start();
return null;
}
protected Drawable loadImageFromUrl(String imageUrl) {
try {
return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public interface ImageCallback{
public void imageLoaded(Drawable imageDrawable);
}
}
User是实体类,省略