现在的位置: 首页 > 综合 > 正文

异步获取网络图片并显示在ListView中

2013年10月14日 ⁄ 综合 ⁄ 共 4609字 ⁄ 字号 评论关闭

今天老师讲了这个,主要是用了缓存的思想,若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是实体类,省略

抱歉!评论已关闭.