ViewPager2/Tabs 問題與 ViewModel 狀態



我遵循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 表现得很奇怪。 在添加选项卡之前,我像这样导航到片段:

NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);

当我把那个片段留给NavHostFragment.findNavController(this).popBackStack(),后来又回到那个片段时,我会得到一个新的空视图模型。这是有意为之。

使用新方法,我正在与return new MergedItemsFragment()一起导航.当我离开该片段并稍后返回时,我得到一个包含旧数据的ViewModel。这是一个问题,因为旧数据不再相关,因为用户在另一个片段中选择了不同的数据。


更新 #1

我意识到他实际上将所有旧的片段保存在内存中,因为相同的打印语句被多次调用。它被称为的次数随着我离开和返回该屏幕的次数而增加。因此,如果我离开并返回 10 次并旋转我的设备,他实际上将执行一行 10 次。任何猜测如何以与视图模型配合使用的方式实现带有导航组件的选项卡/视图页?


更新 #2

我像这样设置我的视图模型:

viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)

我得到的结果相同:

viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);

我将视图模型绑定在片段本身中。因此,this是片段。

根据您的评论,您正在使用片段,在该片段中存在您的查看页。 因此,在为 ViewPager 创建适配器时,您需要传递childFragmentManager而不是getActivity((

下面是您可以使用的视图寻呼机的示例适配器

class NewViewPagerAdapter(fm: FragmentManager, behavior: Int) : FragmentStatePagerAdapter(fm, behavior) {
private val mFragmentList: MutableList<Fragment> = ArrayList()
private val mFragmentTitleList: MutableList<String> = ArrayList()
override fun getItem(position: Int): Fragment {
return mFragmentList[position]
}
override fun getCount(): Int {
return mFragmentList.size
}
fun addFragment(fragment: Fragment, title: String) {
mFragmentList.add(fragment)
mFragmentTitleList.add(title)
}
override fun getPageTitle(position: Int): CharSequence? {
return mFragmentTitleList[position]
}
}

在创建适配器时,像这样调用它

val adapter = NewViewPagerAdapter(
childFragmentManager,
FragmentPagerAdapter.POSITION_UNCHANGED
)

好像你看到FragmentStatePagerAdapter的文档,它指出你应该在适配器的构造函数中传递(FragmentManager,int(。

我希望这能解决你的问题,因为我有一天遇到了同样的问题。

快乐编码。

new ViewModelProvider(requireActivity()).get("your_key", YourViewModel.class)

使用 requireActivity 获取视图模型而不是片段。

最新更新