我正在遵循MVVM模式 - 这意味着我为每个Fragment都有一个ViewModel。
我使用ViewPager2添加了两个选项卡。
我的适配器看起来像这样:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
选项卡正常工作。但是,我注意到我的MergedItemsFragment的ViewModel表现出奇怪的行为。 在我添加选项卡之前,我是这样导航到片段的:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
当我使用 NavHostFragment.findNavController(this).popBackStack()
离开该片段并稍后返回该片段时,我将获得一个新的空的 ViewModel。 这是有意为之的。
采用新方法,我使用 return new MergedItemsFragment()
进行导航。当我离开该片段并稍后返回时,我会得到一个包含旧数据的 ViewModel。这是一个问题,因为旧数据已不再相关,用户在另一个片段中选择了不同的数据。
更新 #1
我意识到他实际上将 所有 旧的 片段 保存在内存中,因为同一条打印语句会被多次调用。它被调用的次数随着我离开和返回该屏幕的次数而增加。因此,如果我离开并返回 10 次,并旋转我的设备,他实际上会执行一行代码 10 次。 您猜如何以一种适用于 ViewModel 的方式实现具有导航组件的选项卡/视图分页器?
更新 #2
我像这样设置了我的 ViewModel:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
我使用相同的方法得到了相同的结果:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
我在Fragment本身绑定了ViewModel。因此,this
是指的是该Fragment本身。
Fragment
(即this
)而不是Activity
。这是使用childFragmentManager
的方法。 - ianhanniballake