在片段视图模型

时间:2018-01-24 14:04:20

标签: android android-fragments kotlin android-viewmodel

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

我在我的应用中使用了Android的DrawerLayout / NavigationView。这意味着MainActivity是我所有片段的主机。

我目前有三个片段(实际上它还有很多片段,但它们或多或少完全像这三个片段一样,只是针对不同的数据集)。

  • ListFragment
  • DetailFragment
  • EditFragment(用于添加和编辑)

在我的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。)

我不太确定我应该去哪里这个方向。有经验的人可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

  

假设我在EditFragment中添加了一个新项目。如何将其添加到ListFragmentViewModel的项目集合中?

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

  

ListFragment位于后台堆栈中,因此它的viewmodel会挂起并且在导航回来时不会重新加载数据,因为它仍然具有之前的集合

应该从项目存储库中找出数据更改,并采取任何有意义的方法来反映数据的变化。这可能只是从数据更改事件中获取数据并更新其内存内容。这可能是从后备存储重新请求信息。原则上,它可能是别的东西。