gpt4 book ai didi

android - 在 fragment View 模型之间传递数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:23 28 4
gpt4 key购买 nike

让我先声明一下,这更像是一个“结构性”问题,我并不是要任何人编写代码;我只是想弄清楚我应该如何构建我的应用程序。

我正在为我的应用程序使用 Android 的 DrawerLayout/NavigationView。这意味着 MainActivity 是我所有 fragment 的宿主。

我目前有三个 fragment (实际上它更多,但它们或多或少与这三个 fragment 完全相同,只是针对不同的数据集)。

  • 列表 fragment
  • 细节 fragment
  • EditFragment(用于添加和编辑)

在我的 ListFragment 上,我有(惊喜!)项目列表。这是 SharedViewModel 上的一个 LiveData 集合(与 MainActivity 的生命周期相关)。当点击一个项目时,我通过接口(interface)监听器将事件传递给 MainActivity

MainActivity 然后加载 DetailFragment。在同一个调用中,我加载了 SharedViewModel 的一个实例(再次绑定(bind)到 MainActivity)。我将 SharedViewModel.selectedItem 设置为点击的项目。然后,在 DetailFragmentonCreate 函数中,我通过 ViewModelProviders.of(activity).get(SharedViewModel::class.java).selectedItem 获取所选项目

DetailFragment 上,有一个编辑按钮。这或多或少地经历了与上述相同的例程,但改为加载 EditFragment。保存编辑/添加的项目后,我通过 MainActivity 的接口(interface)监听器添加/替换 SharedViewModel 集合中的项目。

显然,出于多种原因,这并不是最佳选择。其一,这意味着我至少有五组大型数据围绕着 MainActivity 的生命周期(本质上是应用程序的整个生命周期)。此外,MainActivity 变得无法控制,因为我必须添加越来越多的函数来处理事件。

想要做的是,例如,将我的项目列表放在 ListFragmentViewModel 上,它绑定(bind)到 ListFragment的生命周期。我在 DetailFragmentViewModel 上选择的项目,我在 EditFragmentViewModel 上编辑的项目,等等。

我的问题是我不确定在这种情况下如何正确传递数据。例如,假设我在 EditFragment 中添加了一个新项目。我如何将它放入 ListFragmentViewModel 的项目集合中? ListFragment 位于后台堆栈中,因此它的 View 模型会停留并且在导航回时不会重新加载数据,因为它仍然具有之前的集合。这是有道理的,并且可能是应该的方式(毕竟,谁愿意在转到 DetailFragment 并返回 ListFragment 时等待所有数据加载?),但这意味着我没有在集合中得到我的新项目。

这只是一个例子,但我遇到了很多类似的问题(例如,将所选项目传递给 DetailFragmentViewModel。)

我什至不确定我应该去哪里。有经验的人可以帮我吗?

最佳答案

let's say I add a new item in EditFragment. How do I get that into ListFragmentViewModel's collection of items?

EditFragment 告诉您的项目存储库,“哟!这是一个新项目!”。项目存储库安排更新您的后备存储,并向感兴趣的各方发出一个事件,通知数据更改(例如,在 RxJava PublishSubject 上发出一个事件)。 ListFragmentViewModel 监听这些事件并做出相应的 react 。

ListFragment is in the back-stack, so its viewmodel hangs around and doesn't reload the data when it's navigated back to, since it still has the collection from before

它应该从您的项目存储库中找出数据更改,并采取任何有意义的措施来反射(reflect)该数据更改。这可能只是从数据更改事件中获取数据并更新其内存中的内容。这可能是从后备存储中重新请求信息。原则上,它可以是其他东西。

关于android - 在 fragment View 模型之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48424364/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com