• Android Listview异步动态加载网络图片


    1.定义类MapListImageAndText管理ListViewItem中控件的内容

    package com.google.zxing.client.android.AsyncLoadImage;
     
     
     
    public class MapListImageAndText {
            private String imageUrl;
            private String shopname;
            private String activitynifo;
            private String address;
            private String telephone;
            private String distance;
             
            public MapListImageAndText(String imageUrl, String shopname, String activitynifo, String address, String telephone,String distance) {
                this.imageUrl = imageUrl;
                this.shopname = shopname;
                this.activitynifo = activitynifo;
                this.address = address;
                this.telephone = telephone;
                this.distance=distance;
            }
     
            public String getImageUrl() {
                return imageUrl;
            }
             
            public String getShopname() {
                return shopname;
            }
     
            public String getActivitynifo() {
                return activitynifo;
            }
     
            public String getAddress() {
                return address;
            }
     
            public String getTelephone() {
                return telephone;
            }
             
            public String getDistance() {
                return distance;
            }
     
             
    }

    2. 定义类MapListViewCache实例化ListViewItem中的控件     

    package com.google.zxing.client.android.AsyncLoadImage;
     
    import com.google.zxing.client.android.R;
     
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
     
    public class MapListViewCache {
     
            private View baseView;
            private TextView shopname;
            private TextView activitynifo;
            private TextView address;
            private TextView telephone;
            private TextView distance;
     
            private ImageView imageView;
     
            public MapListViewCache(View baseView) {
                this.baseView = baseView;
            }
     
            public TextView getShopname() {
                if (shopname == null) {
                    shopname = (TextView) baseView.findViewById(R.id.maplistviewitemshopname);
                }
                return shopname;
            }
             
            public TextView getActivitynifo() {
                if (activitynifo == null) {
                    activitynifo = (TextView) baseView.findViewById(R.id.maplistviewitemActi);
                }
                return activitynifo;
            }
             
            public TextView getAddress() {
                if (address == null) {
                    address = (TextView) baseView.findViewById(R.id.maplistviewitemaddr);
                }
                return address;
            }
             
            public TextView getTelephone() {
                if (telephone == null) {
                    telephone = (TextView) baseView.findViewById(R.id.maplistviewitemtelphone);
                }
                return telephone;
            }
     
            public ImageView getImageView() {
                if (imageView == null) {
                    imageView = (ImageView) baseView.findViewById(R.id.maplistviewitemImage);
                }
                return imageView;
            }
             
            public TextView getDistance() {
                if (distance == null) {
                    distance = (TextView) baseView.findViewById(R.id.maplistviewitemdistance);
                }
                return distance;
            }
     
    }

    3. 定义类AsyncImageLoader,开启线程下载指定图片

    package com.google.zxing.client.android.AsyncLoadImage;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.ref.SoftReference;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.HashMap;
     
    import android.graphics.drawable.Drawable;
    import android.os.Handler;
    import android.os.Message;
     
    public class AsyncImageLoader {
     
         private HashMap<String, SoftReference<Drawable>> imageCache;
           
             public AsyncImageLoader() {
                 imageCache = new HashMap<String, SoftReference<Drawable>>();
             }
           
             public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
                 if (imageCache.containsKey(imageUrl)) {
                     SoftReference<Drawable> softReference = imageCache.get(imageUrl);
                     Drawable drawable = softReference.get();
                     if (drawable != null) {
                         return drawable;
                     }
                 }
                 final Handler handler = new Handler() {
                     public void handleMessage(Message message) {
                         imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
                     }
                 };
                 new Thread() {
                     @Override
                     public void run() {
                         Drawable drawable = loadImageFromUrl(imageUrl);
                         imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
                         Message message = handler.obtainMessage(0, drawable);
                         handler.sendMessage(message);
                     }
                 }.start();
                 return null;
             }
           
            public static Drawable loadImageFromUrl(String url) {
                URL m;
                InputStream i = null;
                try {
                    m = new URL(url);
                    i = (InputStream) m.getContent();
                } catch (MalformedURLException e1) {
                    e1.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Drawable d = Drawable.createFromStream(i, "src");
                return d;
            }
           
             public interface ImageCallback {
                 public void imageLoaded(Drawable imageDrawable, String imageUrl);
             }
     
    }

    4. 定义类MapListImageAndTextListAdapter继承ArrayAdapter  

    package com.google.zxing.client.android.AsyncLoadImage;
     
    import java.util.List;
     
    import com.google.zxing.client.android.R;
     
    import com.google.zxing.client.android.AsyncLoadImage.AsyncImageLoader.ImageCallback;
     
    import android.app.Activity;
    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.ListView;
    import android.widget.TextView;
     
    public class MapListImageAndTextListAdapter extends ArrayAdapter<MapListImageAndText> {
     
            private ListView listView;
            private AsyncImageLoader asyncImageLoader;
     
            public MapListImageAndTextListAdapter(Activity activity, List<MapListImageAndText> imageAndTexts, ListView listView) {
                super(activity, 0, imageAndTexts);
                this.listView = listView;
                asyncImageLoader = new AsyncImageLoader();
            }
     
            public View getView(int position, View convertView, ViewGroup parent) {
                Activity activity = (Activity) getContext();
     
                // Inflate the views from XML
                View rowView = convertView;
                MapListViewCache viewCache;
                if (rowView == null) {
                    LayoutInflater inflater = activity.getLayoutInflater();
                    rowView = inflater.inflate(R.layout.maplistviewitem, null);
                    viewCache = new MapListViewCache(rowView);
                    rowView.setTag(viewCache);
                } else {
                    viewCache = (MapListViewCache) rowView.getTag();
                }
                MapListImageAndText imageAndText = getItem(position);
     
                // Load the image and set it on the ImageView
                String imageUrl = imageAndText.getImageUrl();
                ImageView imageView = viewCache.getImageView();
                imageView.setTag(imageUrl);
                Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {
                     
                     
                    public void imageLoaded(Drawable imageDrawable, String imageUrl) {
                        ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);
                        if (imageViewByTag != null) {
                            imageViewByTag.setImageDrawable(imageDrawable);
                        }
                    }
                });
                if (cachedImage == null) {
                    imageView.setImageResource(R.drawable.refresh);
                }else{
                    imageView.setImageDrawable(cachedImage);
                }
                // Set the text on the TextView
                TextView shopname = viewCache.getShopname();
                shopname.setText(imageAndText.getShopname());
                 
                TextView activitynifo = viewCache.getActivitynifo();
                activitynifo.setText(imageAndText.getActivitynifo());
                 
                TextView address = viewCache.getAddress();
                address.setText(imageAndText.getAddress());
                 
                TextView telephone = viewCache.getTelephone();
                telephone.setText(imageAndText.getTelephone());
                 
                TextView distance = viewCache.getDistance();
                distance.setText(imageAndText.getDistance());
                 
                return rowView;
            }
     
    }

    5.主程序中Listview与MapListImageAndTextListAdapter的捆绑     

    //tuangoupoints为对后台传回来的数据解析后得到的字符串
    String[] mtuangoupoints =tuangoupoints.split("@");
     
    List<MapListImageAndText> dataArray=new ArrayList<MapListImageAndText>();
         
    for(int i=0; i<mtuangoupoints.length;i++){
        String[] tonepoint=mtuangoupoints[i].split("#");
         
        String shopname=String.valueOf(i+1)+tonepoint[2];
        String activityinfo=tonepoint[1];
        String address=tonepoint[6];
        String telephone=tonepoint[7];
        String imageurl=tonepoint[8];
        String distance=tonepoint[5];
         
        MapListImageAndText test=new MapListImageAndText(imageurl,shopname,activityinfo,address,telephone,distance);
        dataArray.add(test);
    }
         
    MapListImageAndTextListAdapter adapter=new MapListImageAndTextListAdapter(this, dataArray, mlistView);
    mlistView.setAdapter(adapter);
  • 相关阅读:
    20162304 2017-2018-1 《程序设计与数据结构》第十周学习总结
    20162304 2017-2018-1 《程序设计与数据结构》第九周学习总结
    20162304 2017-2018-1 《程序设计与数据结构》第八周学习总结
    20162302 2017-2018-1《程序设计与数据结构》课程总结
    20162302 实验五《数据结构综合应用》实验报告
    20162302 实验四《图的实现与应用》实验报告
    20162302 《程序设计与数据结构》第十一周学习总结
    20162302 《程序设计与数据结构》第十周学习总结
    20162302 实验三《查找与排序》实验报告
    20162302 《程序设计与数据结构》第九周学习总结
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5541490.html
Copyright © 2020-2023  润新知