我正在使用 Android API Level 28 和 Android 组件。
我有一个应用程序可以在图表中直观地显示我们的数据。我想在后台加载数据并在数据进来时开始绘制图表。我还希望您能够以列表的形式查看数据。
理想情况下,图表和列表的数据应该是相同的对象实例。毕竟,检索数据的网络调用成本很高。另外,根据所选的过滤器,可能有大量数据需要绘制图表。
我无法使用基于服务器的图表构建 API;我必须根据设备上的数据绘制图形。
我可以在后台下载数据并构建图表。我研究了 PagedList 等人的列表视图,效果非常好。
我不知道如何共享数据。换句话说,如果您先查看图表,然后查看列表,则列表不应再次触发下载,因为数据已经存在。同样,如果用户滚动列表然后查看图表。
这对于一侧显示列表、另一侧显示图表的平板电脑特别有用(例如,点击列表中的项目会突出显示图表中的数据点)。
任何指点将不胜感激。
我倾向于构建一个类来处理数据的下载,然后将其分发给任何想要的人 喜欢
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 数据库中。
我最终做的是:
这是我在 RecyclerView 和图表之间共享的 LiveData。
控制图表下载的对象会跟踪当前下载位置和大小。如果图表最终创建共享 LiveData,这将触发初始下载并填充 LiveData 正在观察的底层 PagedList。
每次数据下来,我都会更新下载位置和大小,并为刚刚收到的数据绘制点。如果数据不完整,我发现我必须等待几毫秒才能使用 PagedList 的 loadAround 函数触发下一次下载。
如果 RecyclerView 是用户首先打开的东西,它的 PagedListAdapter 会自动通过相同的 DataSource 向下传输数据,并在用户滚动时填充共享的 LiveData。
当我切换回图表时,由于 LiveData 已填充(全部或部分),因此它可以绘制点。如果数据尚未完成,PagedList 将尝试加载其余部分,绘制下来的数据点。
这是一个非常巧妙的方法。关键是保留 LiveData 并重用它,并弄清楚如何在不使用 RecyclerView 时“手动”填充它。