让我先说一下,这更像是一个“结构性”问题,我并不是要求任何人编写代码。我只是想弄清楚我应该如何构建我的应用程序。
我正在为我的应用程序使用 Android 的DrawerLayout
/ NavigationView
。这意味着它MainActivity
是我所有片段的宿主。
我目前有三个片段(实际上它更多,但它们或多或少与这三个片段完全一样,只是针对不同的数据集)。
- 列表片段
- 细节片段
- EditFragment(用于添加和编辑)
在我的身上ListFragment
,我有(惊喜!)一个物品清单。这是一个LiveData
集合SharedViewModel
(与MainActivity
的生命周期相关联)。当一个项目被点击时,我通过MainActivity
接口监听器传递事件。
MainActivity
然后加载DetailFragment
. 在同一个调用中,我加载了一个SharedViewModel
(再次绑定到MainActivity
)的实例。我设置SharedViewModel.selectedItem
为被点击的项目。然后,在DetailFragment
'sonCreate
函数中,我通过ViewModelProviders.of(activity).get(SharedViewModel::class.java).selectedItem
.
在 上DetailFragment
,有一个编辑按钮。这或多或少地经历了上述相同的例程,但加载的是EditFragment
相反的。保存编辑/添加的项目时,我通过的接口侦听器添加/替换SharedViewModel
集合中的项目。MainActivity
显然,由于几个原因,这不是最优的。一方面,这意味着我至少有五组大型数据在MainActivity
的生命周期中(本质上是应用程序的整个生命周期)。此外,MainActivity
由于我必须添加越来越多的函数来处理事件,因此变得失控。
我想要做的是,例如,我在 a 上的项目列表与ListFragmentViewModel
的ListFragment
生命周期相关联。我在 a 上选择的项目DetailFragmentViewModel
,我在 an 上的编辑项目EditFragmentViewModel
等。
我的问题是我不确定在这种情况下如何正确传递数据。例如,假设我在EditFragment
. 我如何将它放入ListFragmentViewModel
's 的项目集合中?ListFragment
位于后台堆栈中,因此它的视图模型会挂起,并且在导航回时不会重新加载数据,因为它仍然具有之前的集合。这是有道理的,并且可能应该是这样(毕竟,谁愿意等待所有数据在DetailFragment
返回和返回时加载ListFragment
?),但这意味着我没有在集合中获得我的新项目。
这只是一个例子,但我遇到了很多类似的问题(例如,将所选项目传递给DetailFragmentViewModel
.)
我不太确定我什至应该去哪里。有经验的人能帮帮我吗?