Sto seguendo il modello MVVM - nel senso che ho un ViewModel per ogni frammento.
Ho aggiunto due schede utilizzando ViewPager2.
Il mio adattatore è simile al seguente:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Le schede funzionano. Tuttavia, ho notato che ViewModel del mio MergedItemsFragment si sta comportando in modo strano. Prima di aggiungere le schede sono passato al frammento in questo modo:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Quando lasciavo quel frammento NavHostFragment.findNavController(this).popBackStack()
e poi tornavo a quel frammento, ottenevo un nuovo ViewModel vuoto. Questo era previsto.
Con il nuovo approccio con cui sto navigando return new MergedItemsFragment()
. Quando lascio quel frammento e successivamente ritorno, ricevo un ViewModel che contiene i vecchi dati . Questo è un problema perché i vecchi dati non sono più rilevanti perché l'utente ha selezionato dati diversi in un altro frammento.
Aggiornamento n. 1
Mi sono reso conto che in realtà mantiene tutti i vecchi frammenti in memoria perché le stesse dichiarazioni di stampa vengono chiamate più volte. Il tempo che viene chiamato aumenta con il numero di volte che lascio e torno a quella schermata. Quindi, se lascio e ritorno 10 volte e ruoto il mio dispositivo, eseguirà effettivamente una riga 10 volte. Qualcuno indovina come implementare Tab / ViewPager con componenti di navigazione in un modo che funziona con ViewModels?
Aggiornamento n. 2
Ho impostato i miei ViewModels in questo modo:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Ottengo gli stessi risultati con:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Lego ViewModel nel frammento stesso. Pertanto, this
è il frammento.