出于数据绑定目的,在 LiveDatas 中构建分层数据的好方法是什么?

What is a good way to structure hierarchical data in LiveDatas for databinding purposes?

使用数据绑定,我如何才能最好地构建数据以本地化 UI 重绘对应于较大 LiveData 的一个小方面?

我的 UI 是代表 Workout 的片段,其中包含 TableLayouts 的集合,每个对应于一个 Group。每个 TableLayouts 都有一个 TableRows 的集合,对应于 Lifts' Sets。用户可以将 Lifts 添加到 Group(UI 必须反映这一点),也可以添加 Sets 到 Lift(UI 必须反映这一点)。

现在这一切都是通过一个返回 LiveData 的 Room 查询获取的(这是 Workout->Groups->Lifts->Sets 的层次结构)。

现在的问题是,如果您更改一组 属性,它会触发整个 LiveData 的观察器。我可以写一些东西来检查唯一性,然后再通知数据已更改,但这需要一些复杂的深度相等性东西。

或者,我可以获取 LiveData,然后为每个组获取 LiveData(是 Lifts 和 Sets 的层次结构)。然后更改一组会触发 Lift 更改并重绘 UI 的那部分,但不会重绘整个 UI.

不过,如果您这样做,比如说,将文本放入一个集合(这会触发数据库更新)会重新绘制包含该集合的片段,并且焦点会从正确的事情上移开。

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

评论里的讨论竟然解决了问题。在这里发布以便于访问。

回答

如果您使用 RecyclerView 来显示数据,那么您可以将 ListAdapter 与 DiffUtil.Callback 配对使用,以仅更新发生变化的行。当整个 LiveData 更新时,ListAdapter 将只更新已更改的行,根据您的 DiffUtil.Callback。

至于你的确切问题,我不确定除了将大型结构拆分为较小的 LiveData 片段之外,他们的最佳方法。