Android ListView是否自动支持lazyload?

Android ListView是否自动支持lazyload?,android,listview,reactjs,mobile,react-native,Android,Listview,Reactjs,Mobile,React Native,当我向下滚动时,listview中有图像。它似乎可以动态地渲染图像。是懒汉吗?如果是,那么为什么lazyload库存在 看那辆车 我正在listview中渲染25个图像。第一次加载所有图像大约需要5分钟。在渲染所有图像所需的时间少于10秒之后?如果listview执行lazyload,那么为什么加载所有图像需要大约5分钟?React native listview执行一种延迟加载,但仅限于根据pageSize属性和滚动位置呈现行本身。假设您有100行,ListView不会在给定时间渲染所有行。它

当我向下滚动时,listview中有图像。它似乎可以动态地渲染图像。是懒汉吗?如果是,那么为什么lazyload库存在

看那辆车


我正在listview中渲染25个图像。第一次加载所有图像大约需要5分钟。在渲染所有图像所需的时间少于10秒之后?如果listview执行lazyload,那么为什么加载所有图像需要大约5分钟?

React native listview执行一种延迟加载,但仅限于根据pageSize属性和滚动位置呈现行本身。假设您有100行,ListView不会在给定时间渲染所有行。它将只渲染特定数量的行,并在用户向下滚动时渲染更多的行。延迟加载模块通过在实际行视图靠近视图端口之前不渲染它来进一步增强这一点


第二,React本地缓存设备上的图像。所以,无论何时加载远程映像,它都会根据映像的url检查本地缓存。如果存在缓存,则使用该映像,而不是发出新的网络请求

React native ListView确实实现了一种延迟加载,但它仅限于根据pageSize属性和滚动位置呈现行本身。假设您有100行,ListView不会在给定时间渲染所有行。它将只渲染特定数量的行,并在用户向下滚动时渲染更多的行。延迟加载模块通过在实际行视图靠近视图端口之前不渲染它来进一步增强这一点


第二,React本地缓存设备上的图像。所以,无论何时加载远程映像,它都会根据映像的url检查本地缓存。如果存在缓存,则使用该映像,而不是发出新的网络请求

while1已经回答了您的问题。但我想补充一点。这在很大程度上取决于你所说的“惰性负载”是什么意思

  • 您的意思是当用户向下滚动时从API获取数据吗
  • 或者,您的意思是在用户向下滚动时呈现预取的数据
  • 如果答案是1,则否。
    ListView
    与API调用无关。它必须是你写的。如果您的答案是2,那么我已经找到了一系列关于
    ListView
    的信息。我仍然在这里发布相同的答案,以防链接中断

    简而言之,
    ListView
    隐式地处理了大量渲染复杂性

    负载平衡

    在UITableView中,当一个元素出现在屏幕上时,您必须 同步渲染。这意味着您需要的时间少于16毫秒 去做吧。如果没有,则删除一个或多个帧。如果你是 呈现复杂的元素,比如新闻提要故事,基本上是 无法满足此计划,因此您注定要放弃帧

    使用ListView,当您到达当前屏幕的末尾时,您可以 提前准备更多要渲染的行。那些排将是 在不同的线程中呈现,因此在 处理。它工作的原因是负载不稳定 均匀分布。你不需要在每一个细节上都呈现一个新的故事 框架,大多数框架只是滚动,不需要新的故事 出现

    ListView还将一次呈现一个元素,因此如果 在渲染更多行时与某些元素交互,它不会 块直到所有行都已预渲染,它将仅块 一排

    内存管理

    UITableView在内存方面非常保守,它积极地重用 细胞。这一决定是在iPhone1中做出的,当时内存不足 非常稀少。这样做的问题是,重用单元是非常困难的 开发人员极易出错。给你一个脏东西, 你不知道发生了什么突变,你需要 将其重新配置为您想要的样子。在我们的iOS应用程序中,这导致 这么多虫子

    重用单元的问题是某些单元具有内部状态 (视频播放器运行、文本输入、水平滚动位置…)当 如果重用它们,则需要能够序列化该状态并将其放入 返回这并不总是可能的,也不容易,所以你通常 松开此状态,否则会在新行上传播并导致错误

    我们在React Native上发现,它在iphone上的速度足够快 4s为每一行创建新单元格。所以,我们不需要 把这种非常严格的限制强加给我们自己。在你的截图中,你 注意,在您滚动一段时间后,我们不会删除行。 这并不完全正确,我们不删除虚拟dom React端的表示(您在chrome开发中看到的内容 工具),但我们确实从“dom”中删除了这些元素,并保留了它们的 参考资料

    当它们再次可见时,我们将它们放回dom。万一我们 内存不足或列表太大,我们可能会销毁这些 在中从头开始重新创建它们(失去上述状态) 未来。我们还没有进行性能优化,但是 用户代码不会受到影响

    我们试图积极删除iOS视图,但我们发现 这样做实际上是非常昂贵的。最好还是离开他们 悬挂而不是移除它们

    更改检测

    在ListView中,我们有一个支持不变性的数据源对象。如果 如果要渲染1000个元素的列表,则要使这些元素 1000个元素是不可变的,这意味着您可以检查上一个元素 ===下一个并立即知道是否有变化。这样,当任何事情发生变化时,你唯一要做的就是遍历 这两个列表并进行快速的平等性检查,然后知道是什么 行变了。然后只更新那些

    布局

    在UITableView中,您必须指定每个