我一直在ListView中异步加载图像,因为在加载图像时,其中一些图像会闪烁(被另一个加载的图像替换),并且其中一些图像显示在错误的项目中。
下载图像的类:
class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls)
{
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try
{
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
}
catch (Exception e) {}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
当我将数据分配给ListView:时,调用每个项目
ImageView image = (ImageView)view.findViewById(R.id.imageView);
TextView title = (TextView)view.findViewById(R.id.txtTitle);
new DownloadImageTask(image).execute(data.image);
title.setText(data.title);
我应该采取什么不同的做法?
除了Forin所说的,还有许多库可以真正帮助解决这类问题。我个人目前最喜欢的是AQuery:
https://code.google.com/p/android-query/
假设你有一个ImageView,你想下载一个图像,并将ImageView设置为保存该图像。听起来有点难,对吧?对于AQuery,这在一行中完成:
aq.id(R.id.name_of_image_view).image("http://url-of-image.com/image.png");
在这种情况下,aq
是这样声明的AQuery对象:
AQuery aq = new AQuery();
首先,您应该重新考虑使用这个库:
https://github.com/nostra13/Android-Universal-Image-Loader
它将帮助您下载图像并在ListView中显示它们。
您的问题与ListView中的回收视图有关。因此,getView()中的ImageView被重用,这就是为什么列表中的位置正在更改。如果您正在使用holder,并且在if/else
语句中有类似holder.image.setImageDrawable(...)
的内容,那么您应该将其移到条件之外,刚好在return
之上。