【问题标题】:Android Async loading Images in Listview - images are blinkingAndroid 在 Listview 中异步加载图像 - 图像闪烁
【发布时间】:2014-10-08 20:55:21
【问题描述】:

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

我应该做些什么不同的事情?

【问题讨论】:

  • 发布您的适配器代码!

标签: android image listview asynchronous load


【解决方案1】:

除了 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();

【讨论】:

    【解决方案2】:

    首先,你应该重新考虑使用这个库:

    https://github.com/nostra13/Android-Universal-Image-Loader

    它将帮助您下载图像并在 ListView 中显示它们。

    您的问题与 ListView 中的回收视图有关。因此,您在 getView() 中的 ImageView 被重用,这就是您列表中的位置发生变化的原因。如果您正在使用 holder 并且在 if/else 语句内有类似 holder.image.setImageDrawable(...) 的内容,则应将其移到条件之外,就在 return 上方。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多