0

我有一个应用程序可以在后台线程中下载一堆图像。随着每个图标的下载,我将其添加到自定义适配器中的一个 ArrayList,该适配器是 BaseAdapter 的子类。ListView 中使用 BaseAdapter 的每一行都有一个 ImageView。在 getView 中,我执行以下操作。

public View getView(int position, View convertView, ViewGroup parent) {
    final MyCustomImageClass imageObject = data.get(position);
    View vi = convertView;

    if(convertView==null) {
        vi = inflater.inflate(R.layout.list_row, null);
    }

    ImageView thumbnail = (ImageView)vi.findViewById(R.id.list_image);
    File appDir = new File(Utils.getAppFilesDir() +"");
    File imageFolder = new File(appDir, imageObject.getImageFolderName());
    File imageDir = new File(imageFolder, imageObject.getIconFilename());
    Log.e("myapp", "row image dir: " + imageDir.toString());
    if(imageDir.exists()) {
        Bitmap imageBitmap = BitmapFactory.decodeFile(imageDir.toString());
        thumbnail.setImageBitmap(imageBitmap);
    }
    thumbnail.invalidate();
}

但我看到的thumbnail是重新使用旧图像。就像,前几行将具有相同的缩略图图像,即使我在 logcat 中看到它们的路径不同。

如何告诉 ListView 中的行它的 ImageView 有一个新的位图图像?

4

2 回答 2

0

中的每一行ListView都会被回收,因此当一个离开屏幕时,下一个出现的将重用该容器。您可能不满足if新更新的声明,ImageView因此图像未设置为您想要的,因此它只是重用旧图像。确保您的imageDir.exists()遗嘱成功完成,以确保新视图将正确更新。另外,我认为没有任何理由称无效。

编辑:我明白你为什么现在打电话invalidate()了,但仍然没有必要。我建议使用默认图像ImageView,就像 android 提供的那样,然后执行以下操作:

if(imageBitmap != null)
  thumbnail.setImageBitmap(imageBitmap);
else
  thumbnail.setImageDrawable(R.drawable.content_picture);

其中R.drawable.content_picture是默认的“无图片显示”图像,也是为ImageViewXML 文件中定义的图像。

最后,您应该考虑使用 aViewHolder来加快ListView. 这是一个示例:如何实现视图持有者?

如果我在这里所说的任何事情没有意义,请要求澄清。

于 2013-01-27T00:38:11.517 回答
0

适配器正在回收整个列表项,而不仅仅是图像。在等待新位图被解码时,您需要将图像资源重置为占位符。

附带说明一下,您真的不应该在 UI 线程上读取磁盘或解码位图。getView() 方法应该很快就可靠地返回,这排除了在那里做任何实际工作。查看开发指南,了解如何处理位图的好技巧:

http://developer.android.com/training/displaying-bitmaps/index.html

于 2013-01-27T00:39:22.173 回答