Saya mengikuti pola MVVM - artinya saya memiliki ViewModel untuk setiap Fragmen.
Saya menambahkan dua tab dengan menggunakan ViewPager2.
Adaptor saya terlihat seperti ini:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Tab berfungsi. Namun, saya perhatikan bahwa ViewModel dari MergedItemsFragment saya berperilaku aneh. Sebelum saya menambahkan tab, saya menavigasi ke Fragmen seperti ini:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Ketika saya meninggalkan fragmen itu NavHostFragment.findNavController(this).popBackStack()
dan kemudian kembali ke fragmen itu, saya akan mendapatkan ViewModel kosong baru. Ini dimaksudkan.
Dengan pendekatan baru saya menavigasi return new MergedItemsFragment()
. Ketika saya meninggalkan fragmen itu dan kemudian kembali saya mendapatkan ViewModel yang berisi data lama . Itu adalah masalah karena data lama tidak relevan lagi karena Pengguna memilih data yang berbeda di fragmen lain.
Perbarui # 1
Saya menyadari bahwa dia benar-benar menyimpan semua Fragmen lama di memori karena pernyataan cetak yang sama dipanggil beberapa kali. Waktu yang disebut meningkat dengan jumlah kali saya pergi dan kembali ke layar itu. Jadi jika saya pergi dan kembali 10 kali dan memutar perangkat saya dia benar-benar akan mengeksekusi satu baris 10 kali. Adakah tebakan bagaimana menerapkan Tab / ViewPagers dengan Komponen Navigasi dengan cara yang bekerja dengan ViewModels?
Perbarui # 2
Saya mengatur ViewModels saya seperti ini:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Saya mendapatkan hasil yang sama dengan:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Saya mengikat ViewModel dalam Fragmen itu sendiri. Karena itu, this
adalah Fragmen.
sumber
Jawaban:
Sesuai komentar Anda, Anda menggunakan Fragmen dan di dalam Fragmen itu ada viewpager Anda. Jadi saat membuat Adaptor untuk ViewPager, Anda harus melewati childFragmentManager alih-alih getActivity ()
Di bawah ini adalah contoh Adaptor untuk viewPager Anda yang dapat Anda gunakan
dan saat membuat adaptor Anda menyebutnya seperti
seolah-olah Anda melihat dokumentasi untuk FragmentStatePagerAdapter itu menyatakan bahwa Anda harus lulus (FragmentManager, int) di dalam konstruktor adaptor Anda
Saya harap ini akan menyelesaikan masalah Anda karena saya menghadapi masalah yang sama suatu hari nanti.
Selamat coding.
sumber