Ich folge dem MVVM-Muster - was bedeutet, dass ich für jedes Fragment ein ViewModel habe.
Ich habe zwei hinzugefügt mit ViewPager2 Registerkarten hinzugefügt.
Mein Adapter sieht folgendermaßen aus:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Die Registerkarten funktionieren. Ich habe jedoch festgestellt, dass sich das ViewModel meines MergedItemsFragment merkwürdig verhält. Bevor ich Registerkarten hinzufügte, navigierte ich wie folgt zum Fragment:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Wenn ich dieses Fragment mit diesem Fragment verließ NavHostFragment.findNavController(this).popBackStack()
und später zu diesem Fragment zurückkehrte, erhielt ich ein neues leeres ViewModel. Dies war beabsichtigt.
Mit dem neuen Ansatz navigiere ich return new MergedItemsFragment()
. Wenn ich dieses Fragment verlasse und später zurückkehre, erhalte ich ein ViewModel, das die alten Daten enthält . Dies ist ein Problem, da die alten Daten nicht mehr relevant sind, weil der Benutzer andere Daten in einem anderen Fragment ausgewählt hat.
Update Nr. 1
Mir wurde klar, dass er tatsächlich alle alten Fragmente im Speicher behält, weil dieselben Druckanweisungen mehrmals aufgerufen werden. Die Zeiten, die es heißt, erhöhen sich mit der Häufigkeit, mit der ich diesen Bildschirm verlasse und zurückkehre. Wenn ich also 10 Mal gehe und zurückkehre und mein Gerät drehe, führt er tatsächlich 10 Mal eine Zeile aus. Irgendwelche Vermutungen, wie Tabs / ViewPager mit Navigationskomponenten auf eine Weise implementiert werden können, die mit ViewModels funktioniert?
Update Nr. 2
Ich habe meine ViewModels folgendermaßen eingestellt:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Ich erhalte die gleichen Ergebnisse mit:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Ich binde das ViewModel im Fragment selbst. Daher this
ist das Fragment.