Android异步加载Listview中的图像-图像正在闪烁



我一直在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之上。

最新更新