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

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

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

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

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

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

    DetailFragment上,有一个编辑按钮。这或多或少地通过了与上述相同的例程,但是加载了EditFragment。保存已编辑/添加的项目后,我通过SharedViewModel的界面监听器在MainActivity的集合中添加/替换了该项目。

    显然,由于多种原因,这不是最佳的。首先,这意味着我在MainActivity的生命周期(本质上是应用程序的整个生命周期)中至少有五套大型数据。另外,由于我必须添加越来越多的函数来处理事件,所以MainActivity变得无法控制。

    我想要做的是,例如,拥有与ListFragmentViewModel的生命周期相关联的ListFragment上的项目列表。我在DetailFragmentViewModel上选择的项目,在EditFragmentViewModel上编辑的项目,等等。

    我的问题是,在这种情况下,我不确定如何正确传递数据。例如,假设我在EditFragment中添加了一个新项目。如何将其放入ListFragmentViewModel的项目集合中? ListFragment在后台,因此其viewmodel会挂起并且在导航回时不会重新加载数据,因为它仍然具有以前的集合。这是有道理的,大概是应该的(毕竟,谁想要等待所有数据加载到DetailFragment然后再返回到ListFragment吗?),但这意味着我没有在收藏。

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

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

    最佳答案


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



    它应该从项目存储库中查找有关数据更改的信息,并尽一切可能反射(reflect)该数据更改。那可能只是从数据更改事件中获取数据并更新其内存内容。那可能是从后备店重新请求信息。原则上,它可能是另外一回事。

    10-08 09:18
    查看更多