Android ViewPager। एक टुकड़े को दूसरे से कैसे बदला जाए

इस लेख में मैं ViewPager और FragmentStatePagerAdapter के उपयोग का अनुभव साझा करना चाहता हूं, जो संगतता पैकेज में दिखाई दिया। अधिक सटीक रूप से, यह बताने के लिए कि किन समस्याओं का सामना करना पड़ा और उन्हें कैसे हल किया गया। विशेष रूप से, एक टुकड़े को दूसरे के साथ बदलना।

आधिकारिक ब्लॉग android-developers.blogspot.com/2011/08/horiolet-view-swiping-with-viewpager.html पर एक पोस्ट से प्रेरित होकर मैंने कोशिश करना शुरू किया। कार्य का सार एक पृष्ठ के रूप में मेल एप्लिकेशन के टुकड़े, और अन्य पृष्ठों के रूप में तत्काल मैसेंजर एप्लिकेशन के टुकड़े का उपयोग करना था।


मेल एप्लिकेशन के कई टुकड़े हैं, लेकिन उन्हें प्रदर्शित करने के लिए केवल एक पृष्ठ है। सरलता के लिए, हम दो मेल अंशों पर विचार करते हैं - चयनित फ़ोल्डर में फ़ोल्डर्स और अक्षरों की सूची। देखने वाला पहला उपयोगकर्ता फ़ोल्डर सूची का एक टुकड़ा है। जब आप एक विशिष्ट फ़ोल्डर का चयन करते हैं, तो फ़ोल्डर के टुकड़े को उसी पृष्ठ में संबंधित पत्र के टुकड़े से बदल दिया जाता है।

लेकिन, कई लोगों की तरह (यह "एंड्रॉइड व्यूपेजर को टुकड़ों में बदलने के लिए इंटरनेट की खोज के लायक है"), मैं एक समस्या में भाग गया - व्यूगैगर का उपयोग करते समय एक टुकड़ा दूसरे के साथ नहीं बदला गया था।

समाधान निम्न था - ViewPager, PagerAdapter और FragmentStatePagerAdapter कोड को संगतता पैक स्रोत कोड से अपनी परियोजना में स्थानांतरित करने के लिए और निम्नलिखित फ़ंक्शन को ViewPager में जोड़ें:

public void notifyItemChanged(Object oldItem, Object newItem) { if (mItems != null) { for (ItemInfo itemInfo : mItems) { if (itemInfo.object.equals(oldItem)) { itemInfo.object = newItem; } } } invalidate(); } 


और FragmentStatePagerAdapter में जोड़ें:

 public void replaceFragmetns(ViewPager container, Fragment oldFragment, Fragment newFragment) { // ensure getItem returns newFragemtn after calling handleGetItemInbalidated() handleGetItemInbalidated(container, oldFragment, newFragment); startUpdate(container); // remove old fragment if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } int position = getFragmentPosition(oldFragment); while (mSavedState.size() <= position) { mSavedState.add(null); } mSavedState.set(position, null); mFragments.set(position, null); mCurTransaction.remove(oldFragment); // add new fragment while (mFragments.size() <= position) { mFragments.add(null); } mFragments.set(position, newFragment); mCurTransaction.add(container.getId(), newFragment); finishUpdate(container); container.notifyItemChanged(oldFragment, newFragment); } protected abstract void handleGetItemInbalidated(View container, Fragment oldFragment, Fragment newFragment); protected abstract int getFragmentPosition(Fragment fragment); 


आपकी कक्षा में handleGetItemInbalidated () फ़ंक्शन को कार्यान्वित किया गया है, जो कि FragmentStatePagerAdapter से विरासत में मिला है। इसे कॉल करने के बाद, FragmentStatePagerAdapter .getItem () फ़ंक्शन को नया फ़्रेग्मेंट वापस करना चाहिए। getFragmentPosition () भी वंशानुगत वर्ग में लागू किया गया है और पृष्ठ की सूची में टुकड़े के सूचकांक को वापस लौटाता है।

अब टुकड़ों को बदलना इस तरह से किया जाता है:
 mAdapter.replaceFragmetns(mViewPager, oldFragment, newFragment); 


मैं इस तथ्य पर आपका ध्यान आकर्षित करता हूं कि FragmentStatePagerAdapter "अनलोड" (fragmentTransaction.remove ()) पृष्ठ, जो वर्तमान एक से एक स्थिति से अधिक हैं। मेरे आवेदन में, स्क्रॉल करते समय मेल खंड वाले पृष्ठ को अनलोड नहीं किया जाना चाहिए।

ऐसा करने के लिए, FragmentStatePagerAdapter वर्ग में दो कार्यों को ओवरराइड करें:

 @Override public Object instantiateItem(View container, int position) { if (position == getCount() - 1) { if (mMailCahcedFragment == null) { return super.instantiateItem(container, position); } else { return mMailCahcedFragment; } } else { return super.instantiateItem(container, position); } } @Override public void destroyItem(View container, int position, Object object) { if (position == getCount() - 1) { } else { super.destroyItem(container, position, object); } } 


स्थिति (स्थिति == getCount () - 1) इस तथ्य के कारण है कि मेल खंड वाला पृष्ठ हमेशा अंतिम होता है।

ग्रहण में परीक्षण परियोजना डाउनलोड करें: files.mail.ru/I72IP7

Source: https://habr.com/ru/post/In132406/


All Articles