Estoy siguiendo el patrón MVVM, lo que significa que tengo un ViewModel para cada Fragmento.
Añadí dos lengüetas mediante el uso de ViewPager2.
Mi adaptador se ve así:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Las pestañas están funcionando. Sin embargo, noté que el ViewModel de mi MergedItemsFragment se comporta de manera extraña. Antes de agregar pestañas, navegué al Fragmento de esta manera:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Cuando dejé ese fragmento con NavHostFragment.findNavController(this).popBackStack()
y luego volví a ese fragmento, obtendría un nuevo ViewModel vacío. Esto fue intencionado.
Con el nuevo enfoque con el que estoy navegando return new MergedItemsFragment()
. Cuando dejo ese fragmento y más tarde regreso, recibo un ViewModel que contiene los datos antiguos . Eso es un problema porque los datos antiguos ya no son relevantes porque el usuario seleccionó datos diferentes en otro fragmento.
Actualización n. ° 1
Me di cuenta de que en realidad guarda todos los Fragmentos antiguos en la memoria porque las mismas declaraciones de impresión se llaman varias veces. Las veces que se llama aumenta con la cantidad de veces que salgo y regreso a esa pantalla. Entonces, si me voy y regreso 10 veces y giro mi dispositivo, en realidad ejecutará una línea 10 veces. ¿Alguna idea de cómo implementar Tabs / ViewPagers con componentes de navegación de una manera que funcione con ViewModels?
Actualización n. ° 2
Configuré mis ViewModels así:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Obtengo los mismos resultados con:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Ato el ViewModel en el Fragmento mismo. Por lo tanto, this
es el Fragmento.
fuente
Respuestas:
Según su comentario, está utilizando Fragment y dentro de ese Fragment está su visor. Entonces, al crear su Adaptador para ViewPager, debe pasar childFragmentManager en lugar de getActivity ()
A continuación se muestra un adaptador de muestra para su viewPager que puede usar
y mientras creas tu adaptador llámalo como
como si viera la documentación de FragmentStatePagerAdapter , indica que debe pasar (FragmentManager, int) dentro del constructor de su adaptador
Espero que esto resuelva tu problema, ya que un día me enfrenté al mismo problema.
Feliz codificación
fuente