首页 > 解决方案 > 从后端动态加载可变列表(fe. for recyclerview)。可能用于 Facebook、GMail、9GAG、Instagram 和 co

问题描述

我收到了一个关于加载极长的可变帖子列表的问题。

首先,对于不了解 android 的 recyclerview 的人:您从服务器加载一批帖子,例如 25 个帖子,然后将它们显示在可滚动列表中。当您进一步滚动并想要访问位置 25 上的项目时,您从服务器加载下一批。recyclerview 是我的具体问题,但在网站等上也会出现同样的问题。

所以这就是问题所在:假设帖子按喜欢排序,我们的帖子按 {a, b, c, d, e, f, g, h} 的顺序排列,喜欢的次数减少。我们的批量大小是 3,所以我们总是加载 3 个帖子。我们的屏幕一次可以显示 2 个帖子。我们从加载 {a, b, c} 开始。我们在向下滚动并加载 pos3、pos4 和 pos5 之前等待了 10 分钟。在这段时间里,喜欢的人有所不同,新的顺序是{a, b, d, c, f, e, g, h}。我们的下一批将是 {c, f, e},因为我们的后端请求将类似于 backend.com/get3items/?batch=1。由于我们的屏幕可以显示 2 个帖子,因此可以显示 pos2 和 pos3,即 {c, c}。

如果我们删除或添加项目,也会发生同样的情况。批量大小=1,列表={a,b,c}。我们加载一个。新项目 g 被添加到列表的开头。我们再次加载一个。

其他事实:屏幕上的项目数可以高于或低于批量大小。列表的变化可以发生在任何位置。也许我们正在加载批次#500,但在 pos0 处发生了变化。backend.com/get3items/?batch=1 后面的代码可以通过“select * from items order by likes desc limit 3, 3”来完成

对于答案,我想到了这种方法:

1)服务器通过观察者模式通知客户端发生了变化。没用,因为如果有大约 100 万订阅者,服务器会在每次更改时死掉(+ 它对休息不友好,因为服务器必须跟踪订阅者)。

2)服务器可以计算列表在以前的时间是怎样的。哇,有没有我从未听说过的后端技术?

3) 每次加载新批次时,缓冲区和列表中的其他批次都将失效。recyclerview 将调用 notifyondatasetchanged 然后所有显示的项目都被重新加载(因此只有需要的批次被再次加载)。在这里加载批次时,我们必须确保其他批次不会再次失效,因为我们将有一个无限循环的刷新。另一方面 - 当在这里重新加载批次之间发生变化时会发生什么?再次相同,所以不幸的是不是解决方案。

如果我查看 9gag 上的帖子:您可以滚动,但您将获得加载网站时的项目(并且以旧顺序)。如果您刷新页面,您只会看到新帖子。那么有什么如2)中描述的吗?

标签: restandroid-recyclerviewwebbackend

解决方案


推荐阅读