当前位置: 首页 > 面试题库 >

Android-延迟将图像加载到ListView中的问题

饶德本
2023-03-14
问题内容

这是一个非常常见的场景:在ListView中显示必须从Internet下载的图像。

现在,我有一个用于ArrayView的自定义子类ArrayAdapter。在ArrayAdapter的getView()实现中,我产生了一个单独的线程来加载图像。加载完成后,它将查找适当的ImageView并使用ImageView.setImageDrawable()设置图像。因此,我使用的解决方案与此类似:ListView中的图像延迟加载

我遇到的问题是,一旦我在ImageView上调用setImageDrawable(),ListView就会以某种方式刷新列表中所有当前可见的行!这导致了无限循环

  1. getView()被调用
  2. 产生线程以加载图像
  3. 图像已加载;在ImageView上调用setImageDrawable()
  4. ListView出于某种原因将其拾取并刷新
  5. 为了刷新ListView,对每个可见行都调用getView(),因此我们回到步骤1,整个过程会重复进行

据我所知,“ Android-
如何在ListView中延迟加载图像”(请参阅​​上面的链接)中提出的解决方案根本不起作用。看起来好像确实如此,但是它将运行非常缓慢,因为在后台,它会不断重新加载当前可见的行。

有人以前遇到过这个问题和/或对此有解决方案吗?


问题答案:

在链接解决方案中,fetchDrawableOnThread()仅当视图尚未具有正确的可绘制对象时才应调用它。

如果getDrawable()返回null,则视图没有可绘制对象。

如果您正在重复使用插槽,则认为您需要更进一步并管理状态。例如,如果您的视图具有一个存储URL的成员变量和一个布尔值(表示是否已加载),则很容易知道是否调用fetchDrawableOnThread()

我推测可绘制对象toString()详细说明了从中加载图像的路径。(如果没有,您可以将返回的drawable子类化,以使其成为现实)。在这种情况下,您可以避免上面概述的布尔值,而只是进行比较以确定它是否正确绘制或是否获取替换。

另外,在可见行上的getView()应该确保卸载不再可见的那些,以防止内存耗尽。最好将不再可见的图像移到软引用(这样,当需要内存时将其卸载),作为原始线程上的另一张海报。



 类似资料:
  • 问题内容: 我正在使用ListView来显示一些图像和与这些图像相关的标题。我正在从互联网上获取图像。有没有一种方法可以延迟加载图像,以便在显示文本时不阻止UI并在下载图像时显示它们? 图像总数不固定。 问题答案: 这是我创建的用于保存应用程序当前正在显示的图像的内容。请注意,此处使用的“ Log”对象是我在Android内部最终Log类周围的自定义包装。

  • 问题内容: 在我的应用程序中,我需要从URL下载很多图片并将其显示在gridView中。(可以在1-200张照片之间)。我不想一次下载所有图片。我读到了关于延迟下载的信息,我的问题是:我只能得到Json的一部分,以其他线程下载图片, 并且只有当用户向下滚动 gridView时,我才继续到Json的其他部分,并且等等吗? 编辑:再次嗨。我想在此gridView中实现多选,而我很难在适配器的getVi

  • 问题内容: 我正在开发一个eshop。在基于类别的产品页面上,我放置了一些基于javascript的过滤器。但是,如果类别具有很多产品,则会出现问题。该链接具有与我相似的功能… 这个页面多么缓慢,却超过2mb !!! 对我来说,每个产品都需要一半的K字节,但是图像是个问题。.因此,我正在寻找如何延迟加载图像的方法。由于与该网站不同,我的页面具有分页功能,因此我认为加载仅对页面可见的图像是一种解决方

  • 我有一个列表视图,它显示带有缩略图图像的视频,我使用光标适配器(使用ContentProvider获取)。问题是随着列表项数量的增加,列表视图性能变得非常差。请让我知道使其延迟加载的最佳方法。 新:我终于找到了一些解决办法。这对我来说很好。如果你有什么建议,请告诉我。我的新代码在这里。(它使用具有生产者-消费者模式和bacground线程的堆栈进行处理) @覆盖公共空bindView(视图视图、上

  • 我试图使用jQuery懒惰加载在我的Laravel/Vue项目,但我正在努力让图像出现在我的Vue组件。我有以下img块,我认为会工作: 我确实在这里发现了另一个问题-Vue.js模板中的静态图像src-但是当我尝试该方法时,我得到了这样的结果: 因此,我切换回v-bind方法,但我得到的只是一个带有灰色边框的白色框-没有图像。但是,如果我在src属性上使用v-bind,我可以正确地看到图像。 我

  • 我正在使用Mika Tuupola的jQuery延迟加载。 是否可以在每次延迟加载图像后调用函数。 我打算做的是跟踪图像的浏览次数。因此,如果图像是延迟加载的,这意味着用户已经看到了图像,我将通过在后台执行HTTP GET,将数据库中的计数器增加1。