使用 Android PagedList 来显示图表和列表

问题描述 投票:0回答:2

我正在使用 Android API Level 28 和 Android 组件。

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

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

我无法使用基于服务器的图表构建 API;我必须根据设备上的数据绘制图形。

我可以在后台下载数据并构建图表。我研究了 PagedList 等人的列表视图,效果非常好。

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

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

任何指点将不胜感激。

android kotlin
2个回答
0
投票

我倾向于构建一个类来处理数据的下载,然后将其分发给任何想要的人 喜欢

class BananaProvider {
    private var _bananaData: List<String>? = null
    val bananas: List<String>
        get() {
            _bananaData?.let{ return _bananaData!!}
            _bananaData = getBananaData()
            return _bananaData!!
        }
    fun getBananaData(){
        (...)        
    }
}

如果您愿意的话,也许还有一个功能可以为您的 babana 补充新数据。

然后,只需在每个片段/函数/任何需要它的地方删除 BananaProvider 的实例即可。

或者,如果您想在活动之间共享数据,您可以将其序列化并以意图发送,或者如果您想将其保存在本地以供以后使用,则将其放入 SQLite 数据库中。


0
投票

我最终做的是:

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

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.