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

时间:2014-10-08 20:55:22

标签: android image listview asynchronous load

我一直在努力在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);

我应该做些什么?

2 个答案:

答案 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();