为了数据绑定目的,在LiveDatas中构造分层数据的一种好方法是什么?

时间:2019-06-28 20:09:09

标签: android kotlin data-structures android-livedata mutablelivedata

借助数据绑定,我如何最好地构建数据以定位与较大LiveData的一小部分相对应的UI重绘?

我的UI是一个片段,代表一个锻炼,其中包含TableLayout个集合,每个集合对应一个 Group 。每个TableLayout都有与{em> Lift s的 Set s对应的TableRow的集合。用户可以将 Lift 添加到 Group (UI必须反映这一点),也可以将 Set s添加到 Lift (UI必须反映这一点)。

现在,所有这些都可以通过一个Room查询返回LiveData(这是Workout-> Groups-> Lifts-> Sets的层次结构)来获取。

如果更改集合的一个属性,问题现在就出现了,它会触发整个LiveData的观察者。我可以编写一些在通知数据已更改之前检查唯一性的东西,但这将需要一些复杂的深度平等工作。

或者,我可以获取LiveData,然后为每个组获取LiveData(是具有 Set s的 Lift s的层次结构)。然后,更改集合将触发一次Lift更改,并重新绘制UI的该部分,而不是整个UI。

如果仍然这样做,例如,将文本放入集合中(这将触发数据库更新)将重新绘制其中包含该集合的片段,并且焦点会偏离正确的事物。

最终,您将如何构造一个大型数据层次结构,所有这些结构一次显示在屏幕上,以最大程度地减少通过LiveData更改+数据绑定触发的UI重绘?

1 个答案:

答案 0 :(得分:1)

讨论中的讨论原来是解决问题的。在此处发布以便于访问。

答案

如果使用RecyclerView显示数据,则可以将ListAdapter与DiffUtil.Callback配对使用,以仅更新更改的行。更新整个LiveData后,ListAdapter将仅根据DiffUtil.Callback更新已更改的行。

对于您的确切问题,我不确定除了将大型结构拆分为较小的LiveData片段外,它们是否是最佳方法。