Я следую шаблону 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
это фрагмент.