读书人

[转载]Android兑现ListView异步加载图

发布时间: 2012-06-29 15:48:46 作者: rapoo

[转载]Android实现ListView异步加载图片

?

原文分享地址:http://apps.hi.baidu.com/share/detail/34554080

ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码:

?

?

以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。


ViewCache是辅助获取adapter的子元素布局

?

package  cn.wangmeng.test;import  java.util.List;import  cn.wangmeng.test.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  ImageAndTextListAdapter  extends  ArrayAdapter < ImageAndText >  {         private  ListView listView;         private  AsyncImageLoader asyncImageLoader;         public  ImageAndTextListAdapter(Activity activity, List < ImageAndText >  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;            ViewCache viewCache;             if  (rowView  ==   null ) {                LayoutInflater inflater  =  activity.getLayoutInflater();                rowView  =  inflater.inflate(R.layout.image_and_text_row,  null );                viewCache  =   new  ViewCache(rowView);                rowView.setTag(viewCache);            }  else  {                viewCache  =  (ViewCache) rowView.getTag();            }            ImageAndText 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.default_image);            } else {                imageView.setImageDrawable(cachedImage);            }             //  Set the text on the TextView             TextView textView  =  viewCache.getTextView();            textView.setText(imageAndText.getText());             return  rowView;        }}
?

ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。

读书人网 >Android

热点推荐