Estou seguindo o padrão MVVM - o que significa que tenho um ViewModel para cada fragmento.
Eu adicionei duas guias usando o ViewPager2.
Meu adaptador fica assim:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
As guias estão funcionando. No entanto, notei que o ViewModel do meu MergedItemsFragment está se comportando de maneira estranha. Antes de adicionar guias, naveguei para o fragmento assim:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Quando deixei esse fragmento NavHostFragment.findNavController(this).popBackStack()
e depois retornei a ele, recebi um novo ViewModel vazio. Isso foi planejado.
Com a nova abordagem, estou navegando return new MergedItemsFragment()
. Quando deixo esse fragmento e, mais tarde, retorno, estou recebendo um ViewModel que contém os dados antigos . Esse é um problema porque os dados antigos não são mais relevantes porque o Usuário selecionou dados diferentes em outro fragmento.
Atualização # 1
Percebi que ele realmente mantém todos os fragmentos antigos na memória porque as mesmas instruções de impressão são chamadas várias vezes. O tempo que é chamado aumenta com a quantidade de vezes que saio e volto para a tela. Portanto, se eu sair e retornar 10 vezes e girar meu dispositivo, ele executará uma linha 10 vezes. Alguma idéia de como implementar Tabs / ViewPagers com componentes de navegação de uma maneira que funcione com o ViewModels?
Atualização # 2
Defino meus ViewModels assim:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Eu obtenho os mesmos resultados com:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Eu vinculo o ViewModel no próprio fragmento. Portanto, this
é o fragmento.
fonte
Respostas:
De acordo com o seu comentário, você está usando o Fragment e, dentro desse Fragmento, está o seu viewpager. Portanto, ao criar seu adaptador para o ViewPager, você precisa passar childFragmentManager em vez de getActivity ()
Abaixo está um adaptador de amostra para o seu viewPager que você pode usar
e enquanto cria seu adaptador, chame-o como
como se você vir a documentação para FragmentStatePagerAdapter, ela afirma que deve passar (FragmentManager, int) dentro do construtor do adaptador
Espero que isso resolva seu problema, pois eu estava enfrentando o mesmo problema um dia.
Feliz codificação.
fonte