【问题标题】:Images not loaded into ListView when scrolling fast快速滚动时图像未加载到 ListView
【发布时间】:2014-01-08 00:53:12
【问题描述】:

我有一个很长的ListView,其中每一行都有一个ImageView。如果我慢慢滚动列表,它会显示正确的位图(每行都有不同的图标要显示)。

当我快速滚动ListView 时出现问题。碰巧许多图像没有加载到它们的ImageView 中,使其透明。即使是之前显示的列表也会慢慢滚动。

下面是 getView() 方法中应该显示图标的代码:

      BitmapFactory.Options options = new BitmapFactory.Options();
      options.inPreferredConfig = Bitmap.Config.ARGB_8888;
      String name = ... //custom code to get the icon name to show
      Bitmap bitmap = BitmapFactory.decodeFile(getIconsDir() + name + getIconsExt(), options);
      holder.imgIcon.setImageBitmap(bitmap);

我正在回收适配器的getView()方法中的convertView。

我确定该位图存在于该位置。 imgIcon 是行的ViewHolder 引用的ImageView

我也尝试过使用图像加载器(如 Picasso),但得到了相同的结果。

有没有人经历过这种情况?

【问题讨论】:

    标签: android android-imageview


    【解决方案1】:

    不要在适配器的getView() 中进行位图解码。这会导致 ListView 滞后,并且会非常快地填满 RAM。

    你应该:

    1. 使用大小有限的内存缓存来保存位图。
    2. 异步解码和加载视图中的图像。

    ListView 重新循环视图,设备内存可能不会一直保存所有加载的位图。甚至图像加载库也面临这个问题。

    【讨论】:

    • 好的,但是毕加索应该使用内存缓存和异步加载,不是吗?
    • @DanieleVitali 是的,它可能会。但这并不意味着您的列表视图将始终立即加载所有内容,并且在极快滚动时看起来完美像素。
    • 所以我得出结论,即使使用内存缓存和异步加载,在 ListView 中显示图像仍然会出现问题,对吧?
    • @DanieleVitali 问题:不,除非你写错了代码。但是延迟:是的,取决于创建和显示列表视图的单个项目所需的工作量以及加载此类视图所需的时间,视图甚至可能会在未完全加载的情况下滚动屏幕。
    【解决方案2】:

    是的,ListViews 中的图像存在性能问题。 但是以任何方式预取图像都是一种避免调用文件系统上的读取操作和解码二进制数据的方法。 我说您将查看器存储在 convertviews - 标签中。

    【讨论】:

      【解决方案3】:

      从磁盘加载图像是一项缓慢的操作,因此将它们从存储的任何压缩格式(如 JPG 或 PNG)解码为位图也是如此。所以理想情况下,它不应该在主线程的 getView() 中完成。此外,它们会占用大量内存。

      如果这些“图标”是静态的,您应该将它们作为可绘制资源包括在内,然后使用 ImageView.setImageResource。然后操作系统会找出如何以最佳方式加载它们(另外,这样你就可以为给定的屏幕提供正确的分辨率)。

      如果图标不是静态的(例如从网络加载),我建议使用带有异步加载器的内存缓存,但要确保它的大小受到限制和/或使用弱引用(但要注意:Android 通常建议反对使用弱/软引用,尤其是位图,因为为位图分配的内存是本机代码,所以垃圾收集器不知道这些图像真正占用了多少内存,它可能决定不收集它们,即使它是内存不足...因为它认为它们很小)。

      【讨论】:

      • 好的,但是毕加索应该使用内存缓存和异步加载,不是吗?
      • 我对毕加索不熟悉,但我猜如果它确实使用异步加载和内存缓存,那么可以肯定的是,快速滚动时图像可能不会立即加载。不过,它们应该会在几毫秒后正常加载 - 如果您在某些项目上放慢滚动速度。
      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 2018-01-18
      • 1970-01-01
      • 2021-11-15
      • 2015-10-23
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多