我一直在努力在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);
我应该做些什么?
答案 0 :(得分:0)
首先,您应该重新考虑使用此库:
https://github.com/nostra13/Android-Universal-Image-Loader
它可以帮助您下载图像并在ListView中显示它们。
您的问题与ListView中的回收视图有关。因此,重新使用getView()中的ImageView,这就是列表中的位置发生变化的原因。如果您使用的是持有人并且在holder.image.setImageDrawable(...)
语句中有if/else
之类的内容,则应将其移至境外return
之上。
答案 1 :(得分:0)
除了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();