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

Java代码
  1. package cn.wangmeng.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.lang.ref.SoftReference;
  5. import java.net.MalformedURLException;
  6. import java.net.URL;
  7. import java.util.HashMap;
  8. import android.graphics.drawable.Drawable;
  9. import android.os.Handler;
  10. import android.os.Message;
  11. public class AsyncImageLoader{
  12. private HashMap<String,SoftReference<Drawable>>imageCache;
  13. public AsyncImageLoader(){
  14. imageCache=new HashMap<String,SoftReference<Drawable>>();
  15. }
  16. public DrawableloadDrawable( final StringimageUrl, final ImageCallbackimageCallback){
  17. if (imageCache.containsKey(imageUrl)){
  18. SoftReference<Drawable>softReference=imageCache.get(imageUrl);
  19. Drawabledrawable=softReference.get();
  20. if (drawable!= null ){
  21. return drawable;
  22. }
  23. }
  24. final Handlerhandler= new Handler(){
  25. public void handleMessage(Messagemessage){
  26. imageCallback.imageLoaded((Drawable)message.obj,imageUrl);
  27. }
  28. };
  29. new Thread(){
  30. @Override
  31. public void run(){
  32. Drawabledrawable=loadImageFromUrl(imageUrl);
  33. imageCache.put(imageUrl,new SoftReference<Drawable>(drawable));
  34. Messagemessage=handler.obtainMessage(0 ,drawable);
  35. handler.sendMessage(message);
  36. }
  37. }.start();
  38. return null ;
  39. }
  40. public static DrawableloadImageFromUrl(Stringurl){
  41. URLm;
  42. InputStreami=null ;
  43. try {
  44. m=new URL(url);
  45. i=(InputStream)m.getContent();
  46. }catch (MalformedURLExceptione1){
  47. e1.printStackTrace();
  48. }catch (IOExceptione){
  49. e.printStackTrace();
  50. }
  51. Drawabled=Drawable.createFromStream(i,"src" );
  52. return d;
  53. }
  54. public interface ImageCallback{
  55. public void imageLoaded(DrawableimageDrawable,StringimageUrl);
  56. }
  57. }

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

Java代码
  1. package cn.wangmeng.test;
  2. public class ImageAndText{
  3. private StringimageUrl;
  4. private Stringtext;
  5. public ImageAndText(StringimageUrl,Stringtext){
  6. this .imageUrl=imageUrl;
  7. this .text=text;
  8. }
  9. public StringgetImageUrl(){
  10. return imageUrl;
  11. }
  12. public StringgetText(){
  13. return text;
  14. }
  15. }

Java代码
  1. package cn.wangmeng.test;
  2. import android.view.View;
  3. import android.widget.ImageView;
  4. import android.widget.TextView;
  5. public class ViewCache{
  6. private ViewbaseView;
  7. private TextViewtextView;
  8. private ImageViewimageView;
  9. public ViewCache(ViewbaseView){
  10. this .baseView=baseView;
  11. }
  12. public TextViewgetTextView(){
  13. if (textView== null ){
  14. textView=(TextView)baseView.findViewById(R.id.text);
  15. }
  16. return textView;
  17. }
  18. public ImageViewgetImageView(){
  19. if (imageView== null ){
  20. imageView=(ImageView)baseView.findViewById(R.id.image);
  21. }
  22. return imageView;
  23. }
  24. }

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

Java代码
  1. package cn.wangmeng.test;
  2. import java.util.List;
  3. import cn.wangmeng.test.AsyncImageLoader.ImageCallback;
  4. import android.app.Activity;
  5. import android.graphics.drawable.Drawable;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.ArrayAdapter;
  10. import android.widget.ImageView;
  11. import android.widget.ListView;
  12. import android.widget.TextView;
  13. public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText>{
  14. private ListViewlistView;
  15. private AsyncImageLoaderasyncImageLoader;
  16. public ImageAndTextListAdapter(Activityactivity,List<ImageAndText>imageAndTexts,ListViewlistView){
  17. super (activity, 0 ,imageAndTexts);
  18. this .listView=listView;
  19. asyncImageLoader=new AsyncImageLoader();
  20. }
  21. public ViewgetView( int position,ViewconvertView,ViewGroupparent){
  22. Activityactivity=(Activity)getContext();
  23. //InflatetheviewsfromXML
  24. ViewrowView=convertView;
  25. ViewCacheviewCache;
  26. if (rowView== null ){
  27. LayoutInflaterinflater=activity.getLayoutInflater();
  28. rowView=inflater.inflate(R.layout.image_and_text_row,null );
  29. viewCache=new ViewCache(rowView);
  30. rowView.setTag(viewCache);
  31. }else {
  32. viewCache=(ViewCache)rowView.getTag();
  33. }
  34. ImageAndTextimageAndText=getItem(position);
  35. //LoadtheimageandsetitontheImageView
  36. StringimageUrl=imageAndText.getImageUrl();
  37. ImageViewimageView=viewCache.getImageView();
  38. imageView.setTag(imageUrl);
  39. DrawablecachedImage=asyncImageLoader.loadDrawable(imageUrl,new ImageCallback(){
  40. public void imageLoaded(DrawableimageDrawable,StringimageUrl){
  41. ImageViewimageViewByTag=(ImageView)listView.findViewWithTag(imageUrl);
  42. if (imageViewByTag!= null ){
  43. imageViewByTag.setImageDrawable(imageDrawable);
  44. }
  45. }
  46. });
  47. if (cachedImage== null ){
  48. imageView.setImageResource(R.drawable.default_image);
  49. }else {
  50. imageView.setImageDrawable(cachedImage);
  51. }
  52. //SetthetextontheTextView
  53. TextViewtextView=viewCache.getTextView();
  54. textView.setText(imageAndText.getText());
  55. return rowView;
  56. }
  57. }

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

Java代码
  1. <?xmlversion= "1.0" encoding= "utf-8" ?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content" >
  6. <ImageViewandroid:id="@+id/image"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. />
  10. <TextViewandroid:id="@+id/text"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content" />
  13. </LinearLayout>

更多相关文章

  1. [ZZ][Android]使用bindService启动服务
  2. Android(安卓)N调用系统安装APK方法报错原因整理及解决方案
  3. 一个侧屏滑动操作的实例(仿遇见)之三:代码分析
  4. Android(安卓)多次点击事件的触发方法
  5. Android(安卓)Geofence的学习(二)继续翻译官方文档
  6. Android(安卓)结束进程的方法
  7. Android系统开发之七:添加Android(安卓)Native Service方法
  8. 2014.03.07 ——— android GridView 记录和恢复位置
  9. Android(安卓)ApiDemos示例解析(9):App->Activity->Persistent St

随机推荐

  1. Python可以比C++更快,你不信?
  2. 求求你,别用 print 来 debug 了
  3. 谷歌推出人工智能DIY套件:用硬纸板打造你
  4. 谁来接棒深度学习?
  5. IBM推出开源工具帮AI抵御对抗性样本***:DN
  6. 苹果重新开源分布式数据库FoundationDB,已
  7. Segment 放弃了微服务
  8. 90亿美元的“近十年第一版权案”,谷歌、甲
  9. 拜互联网所赐,软件市场和企业规模因此扩大
  10. 数组函数、json、ajax、cors跨域