让我先说一下,这更像是一个"结构"问题,我不是要求任何人编写代码;我只想弄清楚应该如何构建我的应用程序。
我在我的应用中使用了Android的DrawerLayout
/ NavigationView
。这意味着MainActivity
是我所有片段的主机。
我目前有三个片段(实际上它还有很多片段,但它们或多或少完全像这三个片段一样,只是针对不同的数据集)。
在我的ListFragment
上我(惊喜!)一个项目列表。这是LiveData
上的SharedViewModel
集合(与MainActivity
生命周期相关联)。当点击一个项目时,我通过接口监听器将事件传递给MainActivity
。
MainActivity
然后加载DetailFragment
。在同一个调用中,我加载了SharedViewModel
的实例(再次绑定到MainActivity
)。我将SharedViewModel.selectedItem
设置为已点按的项目。然后,在DetailFragment
onCreate
函数中,我通过ViewModelProviders.of(activity).get(SharedViewModel::class.java).selectedItem
获取所选项目。
在DetailFragment
上,有一个编辑按钮。这或多或少与上述相同的例程,但加载EditFragment
。保存编辑/添加的项目后,我会通过SharedViewModel
的界面监听器添加/替换MainActivity
集合中的项目。
显然,由于几个原因,这不是最佳选择。首先,这意味着我在MainActivity
的生命周期(基本上是应用程序的整个生命周期)中至少有五组大数据。此外,MainActivity
逐渐失控,因为我必须添加越来越多的函数来处理事件。
我想要做的事情,例如,ListFragmentViewModel
上的项目列表与 ListFragment
的生命周期相关联。我在DetailFragmentViewModel
上的所选项目,EditFragmentViewModel
上的编辑项目等
我的问题是,在这种情况下,我不确定如何正确传递数据。例如,我们假设我在EditFragment
中添加了一个新项目。如何将其纳入ListFragmentViewModel
的项目集合中? ListFragment
位于后台堆栈中,因此其视图模型会挂起,并且在数据导航回来时不会重新加载数据,因为它仍然具有之前的集合。这是有道理的,可能是它应该的方式(毕竟,谁想要等到所有数据加载到DetailFragment
并返回ListFragment
?)? ,但这意味着我没有在集合中获得我的新项目。
这只是一个例子,但我遇到了很多类似的问题(例如将所选项目传递给DetailFragmentViewModel
。)
我不太确定我应该去哪里这个方向。有经验的人可以帮助我吗?
答案 0 :(得分:4)
假设我在EditFragment中添加了一个新项目。如何将其添加到ListFragmentViewModel的项目集合中?
make_overload
告诉您的商品库,“哟!这是一个新商品!”。项目存储库安排更新您的后备存储,并向感兴趣的各方发出事件通知数据更改(例如,在RxJava EditFragment
上发出事件)。 PublishSubject
会监听这些事件并作出相应的反应。
ListFragment位于后台堆栈中,因此它的viewmodel会挂起并且在导航回来时不会重新加载数据,因为它仍然具有之前的集合
应该从项目存储库中找出数据更改,并采取任何有意义的方法来反映数据的变化。这可能只是从数据更改事件中获取数据并更新其内存内容。这可能是从后备存储重新请求信息。原则上,它可能是别的东西。