0

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

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

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

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

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

尽管如此,如果你这样做,比如说,将文本放入一个集合(触发数据库更新)将重绘包含集合的片段,并且焦点从正确的事情上消失。

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

4

1 回答 1

1

评论中的讨论结果解决了这个问题。在这里发布以方便访问。

回答

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

至于您的确切问题,除了将大型结构拆分为较小的 LiveData 块之外,我还不确定它们是最好的方法。

于 2019-07-30T15:15:03.520 回答