我遵循 MVVM 模式——这意味着我为每个片段都有一个 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 表现得很奇怪。在添加选项卡之前,我导航到 Fragment,如下所示:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
当我离开那个片段NavHostFragment.findNavController(this).popBackStack()
并稍后返回那个片段时,我会得到一个新的空视图模型。这是故意的。
使用我正在导航的新方法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);
我将 ViewModel 绑定在 Fragment 本身中。因此,this
是片段。