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.