Я дотримуюся схеми 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 разів. Хтось здогадується, як реалізувати вкладки / ViewPagers з навігаційними компонентами таким чином, що працює з ViewModels?
Оновлення №2
Я встановив свої ViewModels таким чином:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Я отримую ті ж результати з:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Я пов'язую ViewModel у самому Фрагменті. Тому this
є Фрагмент.