-
mHolder = new ViewHolder();
-
mHolder.mImageView = (ImageView) convertView.findViewById(R.id.image_view);
-
mHolder.mTextView = (TextView) convertView.findViewById(R.id.text_view);
-
convertView.setTag(mHolder);
-
}else {
-
mHolder = (ViewHolder) convertView.getTag();
-
}
-
final String url = URLS[position];
-
mHolder.mTextView.setText(url != null ? url.substring(url.lastIndexOf("/") + 1) : “”);
-
mHolder.mImageView.setTag(URLS[position]);
-
if (mDownloader == null) {
-
mDownloader = new ImageDownloader();
-
}
-
//这句代码的作用是为了解决convertView被重用的时候,图片预设的问题
-
mHolder.mImageView.setImageResource(R.drawable.ic_launcher);
-
if (mDownloader != null) {
-
//异步下载图片
-
mDownloader.imageDownload(url, mHolder.mImageView, “/yanbin”,MainActivity.this, new OnImageDownload() {
-
@Override
-
public void onDownloadSucc(Bitmap bitmap,
-
String c_url,ImageView mimageView) {
-
ImageView imageView = (ImageView) mListView.findViewWithTag(c_url);
-
if (imageView != null) {
-
imageView.setImageBitmap(bitmap);
-
imageView.setTag("");
-
}
-
}
-
});
-
}
-
return convertView;
-
}
-
/**
-
* 使用ViewHolder来优化listview
-
* @author yanbin
-
*
-
*/
-
private class ViewHolder {
-
ImageView mImageView;
-
TextView mTextView;
-
}
-
}
-
}
上面的mDownloader.imageDownload()就是异步下载图片比较核心的方法,该方法在ImageDownloader.java类下。其中的五个参数分别为:要设置在当前ImageView 上的图片的url地址,当前ImageView,文件缓存地址,当前的activity以及图片回调接口。
在ImageDownloader类中,我们首先根据url从软引用中获取图片,如果不存在,从sdcard中读取图片,如果还不存在,则启动一个AsyncTask异步下载图片。注意注意:这里我们做了一个这样的操作:用一个map将当前的url及其对应的MyAsyncTask存放起来了。由于getView会执行至少一次,这一步的操作是为了相同的url创建相同的AsyncTask。在onPostExecute()方法中,将该url对应的信息从map中删除,一定要记得执行这一步。看到很多的异步图片下载的例子中,重复创建AsyncTask都是普遍存在的,这里我们使用上面的思路解决掉了这一问题。更详细的代码自己看ImageDownloader.java类吧,首先给出OnImageDownload.java接口的代码:
[java] view plain copy
-
public interface OnImageDownload {
-
void onDownloadSucc(Bitmap bitmap,String c_url,ImageView imageView);
-
}
ImageDownloader.java的代码(有两百多行,拷贝到eclipse中看会舒服一点):
[java] view plain copy
-
public class ImageDownloader {
-
private static final String