首页 > 解决方案 > 将 Android PagedList 用于图表和列表

问题描述

我将 Android API Level 28 与 android 组件一起使用。

我有一个应用程序可以在图表中直观地显示我们的数据。我想在后台加载数据并开始绘制图表。我还希望您能够以列表的形式查看数据。

理想情况下,图表和列表的数据将是相同的对象实例。毕竟,检索数据的网络调用成本很高。另外,根据选择的过滤器,可能会有很多数据需要绘制图表。

我不能使用基于服务器的图表构建 API;我必须从设备上的数据中绘制图形。

我能够在后台下载数据并构建图表。我查看了 PagedList 等人的列表视图,效果非常好。

我不知道如何共享数据。换句话说,如果您先查看图表然后查看列表,则列表不应再次触发下载,因为数据已经存在。同样,如果用户滚动列表然后查看图表。

这对于一侧显示列表而另一侧是图表的平板电脑特别有用(例如,点击列表中的项目会突出显示图表中的数据点)。

任何指针将不胜感激。

标签: androidkotlinpaging

解决方案


我最终做的是:

  • 创建了一个具有从服务器获取数据的函数的 DataSource。我正在使用 PositionalDataSource。
  • 创建了一个 DataSourceFactory 来提供我的 DataSource
  • 使用 LivePagedListBuilder 和我的工厂和 PagedList.Config 创建了一个 LiveData(一次引入 100 条记录,这似乎最适合我的需要)

这是我在 RecyclerView 和图表之间共享的 LiveData。

控制图表下载的对象会跟踪当前的下载位置和大小。如果图表最终创建了共享 LiveData,这将触发初始下载并填充 LiveData 正在观察的底层 PagedList。

每次数据下降时,我都会更新下载位置和大小,并为刚刚收到的数据绘制点。如果数据不完整,我发现我必须等待几毫秒才能使用 PagedList 的 loadAround 函数触发下一次下载。

如果 RecyclerView 是用户首先打开的东西,它的 PagedListAdapter 会自动通过相同的 DataSource 将数据向下传递,并在用户滚动时填充共享的 LiveData。

当我切换回图表时,由于 LiveData 已经填充(全部或部分),它可以绘制点。如果数据尚未完成,PagedList 将尝试加载其余数据,绘制数据点。

这是一个非常巧妙的方法。关键是保留 LiveData 并重用它,并弄清楚在不使用 RecyclerView 时如何“手动”填充它。


推荐阅读