Ben MVVM desen takip ediyorum - yani her Parça için bir ViewModel var.
ViewPager2'yi kullanarak iki sekme ekledim .
Adaptörüm şöyle:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Sekmeler çalışıyor. Ancak, benim MergedItemsFragment ViewModel garip davranıyor fark ettim. Sekme eklemeden önce Fragment'e şu şekilde gittim:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Bu parçayı bırakıp NavHostFragment.findNavController(this).popBackStack()
daha sonra bu parçasına döndüğümde yeni bir boş ViewModel alırdım. Bu amaçlanmıştı.
Yeni yaklaşımla birlikte ilerliyorum return new MergedItemsFragment()
. Bu parçayı bıraktığımda ve daha sonra geri döndüğümde eski verileri içeren bir ViewModel alıyorum . Bu, Kullanıcı başka bir parçada farklı veriler seçtiği için eski verilerin artık alakalı olmadığı için bir sorundur.
Güncelleme # 1
Aslında tüm eski Fragmanları hafızada tuttuğunu fark ettim çünkü aynı baskı ifadeleri birden çok kez çağrılır. Adı verilen süreler, o ekrana gitme ve geri dönme süremle birlikte artar. Bu yüzden 10 kez ayrılıp geri dönersem ve cihazımı döndürürsem, aslında 10 kez bir satır yürütür. Herhangi bir sekme / ViewPagers Gezinti Bileşenleri ile ViewModels ile çalışan bir şekilde nasıl uygulanacağını tahmin?
Güncelleme # 2
ViewModels'ımı şöyle ayarladım:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
İle aynı sonuçları elde:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
ViewModel'i Fragment'ın kendisine bağlarım. Bu nedenle, this
Parçadır.