Podążam za wzorcem MVVM - co oznacza, że mam ViewModel dla każdego fragmentu.
Dodałem dwie zakładki za pomocą ViewPager2.
Mój adapter wygląda następująco:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Karty działają. Zauważyłem jednak, że ViewModel mojego MergedItemsFragment zachowuje się dziwnie. Przed dodaniem zakładek nawigowałem do Fragmentu w następujący sposób:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Kiedy opuściłem ten fragment, NavHostFragment.findNavController(this).popBackStack()
a później wróciłem do tego fragmentu, dostanę nowy pusty ViewModel. To było zamierzone.
Dzięki nowemu podejściu nawiguję return new MergedItemsFragment()
. Kiedy opuszczam ten fragment, a później wracam, otrzymuję ViewModel, który zawiera stare dane . Jest to problem, ponieważ stare dane nie są już istotne, ponieważ użytkownik wybrał różne dane w innym fragmencie.
Aktualizacja nr 1
Uświadomiłem sobie, że tak naprawdę zachowuje wszystkie stare Fragmenty w pamięci, ponieważ te same instrukcje drukowania są wywoływane wiele razy. Czas nazywa się tym wzrasta wraz z czasem, kiedy wychodzę i wracam do tego ekranu. Więc jeśli wyjdę i wrócę 10 razy i obrócę swoje urządzenie, faktycznie wykona jedną linię 10 razy. Czy zgadujesz, jak zaimplementować Tab / ViewPagers za pomocą komponentów nawigacyjnych w sposób, który działa z ViewModels?
Aktualizacja nr 2
Moje ViewModels ustawiam w następujący sposób:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Otrzymuję te same wyniki z:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Wiążę ViewModel w samym fragmencie. Dlatego this
jest Fragment.
źródło
Odpowiedzi:
Zgodnie z komentarzem używasz Fragmentu, a wewnątrz tego Fragmentu znajduje się Twoja przeglądarka. Dlatego podczas tworzenia adaptera do ViewPager musisz przekazać childFragmentManager zamiast getActivity ()
Poniżej znajduje się przykładowy adapter do przeglądarki viewPager, którego można użyć
i podczas tworzenia adaptera nazwij to tak
tak jak w dokumentacji FragmentStatePagerAdapter stwierdza się, że należy przekazać (FragmentManager, int) do konstruktora adaptera
Mam nadzieję, że to rozwiąże problem, ponieważ pewnego dnia miałem do czynienia z tym samym problemem.
Szczęśliwego kodowania.
źródło