मैं MVVM पैटर्न का अनुसरण कर रहा हूं - जिसका अर्थ है कि मेरे पास प्रत्येक फ्रेग्मेंट के लिए एक ViewModel है।
मैंने ViewPager2 का उपयोग करके दो टैब जोड़े ।
मेरा एडॉप्टर ऐसा दिखता है:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
टैब काम कर रहे हैं। हालाँकि, मैंने देखा कि मेरे मर्जमैडमफ्रेम का दृश्यमॉडल अजीब व्यवहार कर रहा है। इससे पहले कि मैं इस तरह से फ्रेग्मेंट में नेविगेट किया गया टैब जोड़ा:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
जब मैंने उस टुकड़े को छोड़ दिया NavHostFragment.findNavController(this).popBackStack()
और बाद में उस खंड में वापस आ गया तो मुझे एक नया खाली दृश्यमॉडल मिलेगा। यह इरादा था।
नए दृष्टिकोण के साथ मैं नेविगेट कर रहा हूं return new MergedItemsFragment()
। जब मैं उस टुकड़े को छोड़ता हूं और बाद में वापस आता हूं तो मुझे एक ViewModel मिल रहा है जिसमें पुराना डेटा है । यह एक मुद्दा है क्योंकि पुराना डेटा अब प्रासंगिक नहीं है क्योंकि उपयोगकर्ता ने किसी अन्य टुकड़े में भिन्न डेटा का चयन किया है।
अपडेट # 1
मुझे एहसास हुआ कि वह वास्तव में सभी पुराने फ़्रैगमेंट्स को स्मृति में रखता है क्योंकि एक ही प्रिंट स्टेटमेंट को कई बार कहा जाता है। जिस समय को मैं स्क्रीन पर छोड़ता हूं और उस स्क्रीन पर वापस लौटता हूं, इसे बढ़ाना कहा जाता है। इसलिए अगर मैं 10 बार लौटता हूं और अपने डिवाइस को घुमाता हूं तो वह वास्तव में 10 बार एक लाइन को निष्पादित करेगा। कोई भी अनुमान लगाता है कि नेविगेशन घटकों के साथ टैब / व्यूपैंसर्स को कैसे लागू किया जाए जो कि व्यूमॉडल के साथ काम करता है?
अद्यतन # 2
मैंने अपना ViewModels इस तरह सेट किया:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
मुझे इसके परिणाम समान मिलते हैं:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
मैं ViewModel को ही खंड में बांधता हूं। इसलिए, this
फ्रैगमेंट है।