Je suis le modèle MVVM - ce qui signifie que j'ai un ViewModel pour chaque fragment.
J'ai ajouté deux onglets en utilisant ViewPager2.
Mon adaptateur ressemble à ceci:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Les onglets fonctionnent. Cependant, j'ai remarqué que le ViewModel de mon MergedItemsFragment se comporte bizarrement. Avant d'ajouter des onglets, j'ai navigué vers le fragment comme ceci:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Lorsque je NavHostFragment.findNavController(this).popBackStack()
quittais ce fragment avec et revenais plus tard sur ce fragment, j'obtenais un nouveau ViewModel vide. C'était prévu.
Avec la nouvelle approche avec laquelle je navigue return new MergedItemsFragment()
. Lorsque je quitte ce fragment et que je reviens plus tard, j'obtiens un ViewModel qui contient les anciennes données . C'est un problème parce que les anciennes données ne sont plus pertinentes car l'utilisateur a sélectionné différentes données dans un autre fragment.
Mise à jour # 1
J'ai réalisé qu'il garde en fait tous les anciens fragments en mémoire car les mêmes instructions d'impression sont appelées plusieurs fois. Le nombre d'appels augmente avec le nombre de fois où je pars et reviens à cet écran. Donc, si je pars et reviens 10 fois et que je fais pivoter mon appareil, il exécutera une ligne 10 fois. Vous devinez comment implémenter Tabs / ViewPagers avec des composants de navigation d'une manière qui fonctionne avec ViewModels?
Mise à jour # 2
J'ai défini mes ViewModels comme ceci:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
J'obtiens les mêmes résultats avec:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Je lie le ViewModel dans le fragment lui-même. C'est donc this
le Fragment.
la source
Réponses:
Selon votre commentaire, vous utilisez Fragment et à l'intérieur de ce Fragment se trouve votre viewpager. Ainsi, lors de la création de votre adaptateur pour ViewPager, vous devez passer childFragmentManager au lieu de getActivity ()
Voici un exemple d'adaptateur pour votre viewPager que vous pouvez utiliser
et lors de la création de votre adaptateur, appelez-le comme
comme si vous voyez la documentation de FragmentStatePagerAdapter, il indique que vous devez passer (FragmentManager, int) à l' intérieur du constructeur de votre adaptateur
J'espère que cela résoudra votre problème car j'étais confronté au même problème un jour.
Codage heureux.
la source