【发布时间】:2019-06-28 20:09:09
【问题描述】:
使用数据绑定,我如何才能最好地构建数据以本地化 UI 重绘,仅对应于较大 LiveData 的一个小方面?
我的 UI 是一个代表 Workout 的片段,其中包含 TableLayouts 的集合,每个都对应于一个 Group。 TableLayouts 每个都有一个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