use*_*789 10 java android android-viewmodel android-architecture-navigation android-viewpager2
我遵循 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();
}
Run Code Online (Sandbox Code Playgroud)
选项卡正在工作。但是,我注意到我的 MergedItemsFragment 的 ViewModel 表现得很奇怪。在我添加标签之前,我像这样导航到 Fragment:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Run Code Online (Sandbox Code Playgroud)
当我离开那个片段NavHostFragment.findNavController(this).popBackStack()然后返回到那个片段时,我会得到一个新的空 ViewModel。这是有意的。
使用新方法,我正在使用return new MergedItemsFragment(). 当我离开那个片段并稍后返回时,我得到一个包含旧数据的 ViewModel 。这是一个问题,因为旧数据不再相关,因为用户在另一个片段中选择了不同的数据。
更新 #1
我意识到他实际上将所有旧片段保存在内存中,因为多次调用相同的打印语句。它被调用的次数随着我离开并返回该屏幕的次数而增加。因此,如果我离开并返回 10 次并旋转我的设备,他实际上会执行一行 10 次。任何猜测如何以与 ViewModels 一起工作的方式使用导航组件实现 Tabs/ViewPagers?
更新 #2
我这样设置我的 ViewModel:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Run Code Online (Sandbox Code Playgroud)
我得到相同的结果:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Run Code Online (Sandbox Code Playgroud)
我在 Fragment 本身中绑定了 ViewModel。因此,this是 Fragment。
根据您的评论,您正在使用 Fragment 并且在该 Fragment 中有您的 viewpager。因此,在为 ViewPager 创建适配器时,您需要传递childFragmentManager而不是getActivity()
以下是您可以使用的 viewPager 的示例适配器
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]
}
}
Run Code Online (Sandbox Code Playgroud)
在创建您的适配器时调用它
val adapter = NewViewPagerAdapter(
childFragmentManager,
FragmentPagerAdapter.POSITION_UNCHANGED
)
Run Code Online (Sandbox Code Playgroud)
就像您看到FragmentStatePagerAdapter的文档一样,它指出您应该在适配器的构造函数中传递(FragmentManager, int)
我希望这能解决您的问题,因为有一天我遇到了同样的问题。
快乐编码。
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |