本文实例讲述了Android实现ListView异步加载图片的方法。分享给大家供大家参考。具体如下:

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

package cn.wangmeng.test;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> imageCache; public AsyncImageLoader() {  imageCache = new HashMap>();  } public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {  if (imageCache.containsKey(imageUrl)) {   SoftReference 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));   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);  }}

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

几个辅助类文件:

package cn.wangmeng.test;public class ImageAndText { private String imageUrl; private String text; public ImageAndText(String imageUrl, String text) {  this.imageUrl = imageUrl;  this.text = text; } public String getImageUrl() {  return imageUrl; } public String getText() {  return text; }}
package cn.wangmeng.test;import android.view.View;import android.widget.ImageView;import android.widget.TextView;public class ViewCache { private View baseView; private TextView textView; private ImageView imageView; public ViewCache(View baseView) {  this.baseView = baseView; } public TextView getTextView() {  if (textView == null) {  textView = (TextView) baseView.findViewById(R.id.text);  }  return textView; } public ImageView getImageView() {  if (imageView == null) {  imageView = (ImageView) baseView.findViewById(R.id.image);  }  return imageView; }}

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 { private ListView listView; private AsyncImageLoader asyncImageLoader; public ImageAndTextListAdapter(Activity activity, List 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,大家仔细阅读就知道了。

最后贴出布局文件:

<?xml version="1.0" encoding="utf-8"?>  

运行效果截图如下:

希望本文所述对大家的C#程序设计有所帮助。

更多相关文章

  1. 在android中使用USB进行通信的4种方法
  2. Android(安卓)重写物理返回键
  3. Android(安卓)动态添加按钮,并获取id,添加事件
  4. 获取MD5指纹的时候遇到错误
  5. android studio 快捷键(本文持续更新)
  6. Android(安卓)谈谈我所理解的MVP
  7. Android中判断当前API的版本号方法
  8. Android实现加载广告图片和倒计时的开屏布局
  9. 使用Html在EditText中任意位置插入图片并正确显示

随机推荐

  1. Android开发人员必备的10 个开发工具
  2. Android的常用传感器
  3. Android中对Log日志文件的分析
  4. android应用安全——通信安全(android htt
  5. 开发可统计单词个数的Android驱动程序(1)
  6. Android(安卓)事件分发机制
  7. 打包Android程序—Android跟我学2.2
  8. android关于installLocation
  9. 在Android中使用Handler和Thread线程执行
  10. Android(安卓)cts all pass 全攻略