出于数据绑定目的,在 LiveDatas 中构建分层数据的好方法是什么?
What is a good way to structure hierarchical data in LiveDatas for databinding purposes?
使用数据绑定,我如何才能最好地构建数据以本地化 UI 重绘对应于较大 LiveData 的一个小方面?
我的 UI 是代表 Workout 的片段,其中包含 TableLayout
s 的集合,每个对应于一个 Group。每个 TableLayout
s 都有一个 TableRow
s 的集合,对应于 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 片段之外,他们的最佳方法。
使用数据绑定,我如何才能最好地构建数据以本地化 UI 重绘对应于较大 LiveData 的一个小方面?
我的 UI 是代表 Workout 的片段,其中包含 TableLayout
s 的集合,每个对应于一个 Group。每个 TableLayout
s 都有一个 TableRow
s 的集合,对应于 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 片段之外,他们的最佳方法。