【问题标题】:What is a good way to structure hierarchical data in LiveDatas for databinding purposes?出于数据绑定的目的,在 LiveDatas 中构建分层数据的好方法是什么?
【发布时间】:2019-06-28 20:09:09
【问题描述】:

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

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

目前,这一切都是通过一个 Room 查询返回 LiveData(这是锻炼->组->升降机->组的层次结构)获取的。

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

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

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

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

【问题讨论】:

  • 您必须使用 TableLayout 还是 RecyclerView 也能正常工作?如果是这样,您可以使用与 DiffUtil.Callback 配对的 ListAdapter,然后当整个 LiveData 更新时,ListAdapter 将仅根据您的 DiffUtil.Callback 更新已更改的行。至于您的确切问题,除了将大型结构拆分为较小的 LiveData 片段之外,我还不确定它们的最佳方法
  • 我不知道回收站视图!我使用表格布局只是因为它会自动排列列。在回收站视图中有没有好的方法?还是很难?
  • 在 HTML 世界中,没有表格和没有预先确定的宽度是很麻烦的,我讨厌这样做
  • 我想这完全取决于你的用户界面是什么样的,以及一次显示多少“行”。它们可以非常灵活,但有时需要对开发人员进行更多设置才能正确查看。您也可以只创建一个 DiffUtil.Callback 并直接使用它来确定需要更新哪些 TableLayouts/Rows。有点中间立场
  • @drees 如果您愿意,您可以将此作为答案发布,我会将其标记为正确答案。我最终做到了这一点。

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


【解决方案1】:

在 cmets 中的讨论最终解决了这个问题。在这里发布以便于访问。

回答

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

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

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2011-05-27
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多