Я следую шаблону MVVM - это значит, что у меня есть ViewModel для каждого фрагмента.
Я добавил две вкладки с помощью ViewPager2.
Мой адаптер выглядит так:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Вкладки работают. Однако я заметил, что ViewModel моего MergedItemsFragment ведет себя странно. Прежде чем добавить вкладки, я перешел к фрагменту следующим образом:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Когда я оставил этот фрагмент с, NavHostFragment.findNavController(this).popBackStack()
а позже вернулся к этому фрагменту, я получил бы новую пустую ViewModel. Это было предназначено.
С новым подходом я ориентируюсь return new MergedItemsFragment()
. Когда я оставляю этот фрагмент и позже возвращаюсь, я получаю ViewModel, который содержит старые данные . Это проблема, потому что старые данные больше не актуальны, потому что Пользователь выбрал другие данные в другом фрагменте.
Обновление № 1
Я понял, что он на самом деле хранит все старые фрагменты в памяти, потому что одни и те же операторы печати вызываются несколько раз. Время его вызова увеличивается с количеством раз, когда я ухожу и возвращаюсь к этому экрану. Поэтому, если я уйду и вернусь 10 раз и поверну свое устройство, он фактически выполнит одну строку 10 раз. Кто-нибудь догадывается, как реализовать вкладки / ViewPager с компонентами навигации в манере, которая работает с ViewModels?
Обновление № 2
Я установил свои ViewModels так:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Я получаю те же результаты с:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Я связываю ViewModel в самом фрагменте. Следовательно, this
это фрагмент.
Ответы:
Согласно вашему комментарию, вы используете Fragment, а внутри этого фрагмента находится ваш ViewPager. Поэтому при создании вашего адаптера для ViewPager вам нужно передать childFragmentManager вместо getActivity ()
Ниже приведен пример адаптера для вашего viewPager, который вы можете использовать
и при создании вашего адаптера назовите его как
как будто вы видите документацию для FragmentStatePagerAdapter, в которой говорится, что вы должны передать (FragmentManager, int) внутри конструктора вашего адаптера
Я надеюсь, что это решит вашу проблему, так как однажды я столкнулся с той же проблемой.
Удачного кодирования.
источник