FragmentPagerAdapter getItem नहीं कहा जाता है


123

मैं FragmentPagerAdapter में खंडन का पुन: उपयोग करने में सक्षम नहीं हूँ .. विध्वंस () विधि का उपयोग करके, यह खंड को हटा रहा है, लेकिन फिर भी getItem () को फिर से नहीं बुलाया जाता है। केवल 2-3 छवियां हैं इसलिए मैं FragmentStatePagerAdapter के बजाय FratmentPagerAdapter का उपयोग कर रहा हूं ..

public class ExamplePagerAdapter extends FragmentPagerAdapter {

    ArrayList < String > urls;
    int size = 0;
    public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
        super(fm);
        urls = res;
        size = urls.size();
    }

    @Override
    public int getCount() {
        if (urls == null) {
            return 0;
        } else {
            return size;
        }

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();
    }

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = new FloorPlanFragment();
        Bundle b = new Bundle();
        b.putInt("p", position);
        b.putString("image", urls.get(position));
        Log.i("image", "" + urls.get(position));
        fragment.setArguments(b);
        return fragment;
    }
}

और फ्रैगमेंटएक्टिविटी में,

pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2)); 

3
क्या कोई विशेष कारण है जो आपने ओवररोड किया है destroyItem()? यह आवश्यक नहीं है।
कॉमन्सवेयर

फिर से उपयोग करने के लिए FragmentStatePagerAdapter का उपयोग करें जब आप इसे ओवरराइड करते हैं तो कॉल करें। Super.destroyItem (कंटेनर, स्थिति, ऑब्जेक्ट);
faiziii

जवाबों:


306

KISS उत्तर:

सरल उपयोग FragmentStatePagerAdapter के बजाय FragmentPagerAdapter

मुझे जवाब मिल गया .. सबसे पहले मैंने इस सवाल को हटाने के बारे में सोचा क्योंकि मैं एक बहुत ही मूर्खतापूर्ण गलती कर रहा हूं लेकिन इस जवाब से किसी ऐसे व्यक्ति को मदद मिलेगी जो उसी समस्या का सामना कर रहा है जिसके बजाय FragmentPagerAdapter, उपयोग करें FragmentStatePagerAdapter

जैसा कि @BlackHatSamurai ने टिप्पणी में उल्लेख किया है:

इसका कारण यह है कि क्योंकि FragmentStatePagerAdapterउपयोग किए जा रहे Fragments के रूप में नष्ट कर देता है। FragmentPagerAdapterनहीं करता।


बहुत बहुत धन्यवाद।उनके जवाब से मुझे बहुत मदद मिली।
प्रिया

1
एक और 'मुझे भी!' पोस्ट, लेकिन हाँ>। <प्रश्न को नहीं हटाने के लिए धन्यवाद।
पॉल रुइज

34
इसका कारण यह है क्योंकि FragmentStatePagerAdapter फ़्रैगमेंट के रूप में नष्ट हो जाता है जिसका उपयोग नहीं किया जा रहा है। FragmentPagerAdapter नहीं करता है।
ब्लैकहैटसमुरी

3
सिर्फ उन लोगों के लिए भविष्य के संदर्भ के लिए जो उन्हें एक विशेष समस्या की खोज करते हुए मिल सकते हैं; FragmentPagerAdapter और FragmentStatePagerAdapter दोनों पर पढ़ें। वे एक कारण के लिए अलग तरह से व्यवहार करते हैं और आपके विशिष्ट उपयोग के लिए एक दूसरे की आवश्यकता हो सकती है।
क्रिस स्टीवर्ट

2
@najibputhawala मैंने FragmentStatePagerAdapter का उपयोग किया, लेकिन अभी भी उसी मुद्दे का सामना कर रहा है। getItem () नहीं बुलाया
sam_k

168

FragmentStatePagerAdapterमेरी समस्या का पूरी तरह से उपयोग नहीं किया गया था, जो एक समान मुद्दा onCreateViewथा, जहां दृश्य पेजर में बाल टुकड़े के लिए नहीं बुलाया जा रहा था। मैं वास्तव में दूसरे के अंदर अपने घोंसले का शिकार करFragmentPagerAdapterFragment रहा हूं इसलिए FragmentManagerउन सभी के बीच साझा किया गया था और इस तरह पुराने टुकड़ों के उदाहरणों को बरकरार रखा। इसके बजाय मेरे मेजबान टुकड़े में getChildFragmentManagerकंस्ट्रक्टर के एक उदाहरण को फीड करना था FragmentPagerAdapter। कुछ इस तरह...

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());

getChildFragmentManager()विधि एक टुकड़ा के माध्यम से पहुँचा जा सकता है और क्योंकि यह एक निजी रिटर्न यह मेरे लिए काम किया FragmentManagerविशेष रूप से परिस्थितियाँ होती हैं जिनमें नेस्टिंग टुकड़े की जरूरत है के लिए है कि टुकड़ा के लिए। मुझे उम्मीद है कि यह किसी को मदद करता है जो एक ही समस्या हो सकती है जो मैं था !!

  • ध्यान रखें कि getChildFragmentManager()आपके न्यूनतम एपीआई संस्करण का उपयोग करने के लिए कम से कम होना चाहिए 17 (4.2), इसलिए यह आपके गियर में एक रिंच फेंक सकता है। बेशक, यदि आप समर्थन पुस्तकालय v4 से टुकड़े का उपयोग कर रहे हैं तो आपको ठीक होना चाहिए।

25
यह सही जवाब है। समस्या यह है कि अन्य टुकड़ों में नेस्टेड टुकड़ों को getFragmentManager () के बजाय getChildrenFragmentManager () का उपयोग करना चाहिए।
शिहपेंग

बहुत बहुत धन्यवाद, यह जवाब खोजने के लिए मुझे हमेशा के लिए ले लिया!
श्पोंगोलॉइड

मैं @shhpeng से सहमत हूं। यह सही उत्तर होना चाहिए।
रेमंड लुकंटा

यह मेरे लिए एक फिक्स था। जवाब प्रस्तुत करने के लिए बहुत बहुत धन्यवाद
user3734429

डॉक्स को वास्तव में वॉक-थ्रू में इसे बाहर करना चाहिए। यह अत्यधिक यथार्थवादी है कि एक ViewPager एक टुकड़े के भीतर लोड किया जाएगा। इस उत्तर को पोस्ट करने के लिए धन्यवाद।
काम किया

7

अवहेलना long getItemId (int position)

FragmentPagerAdapterइसके उपयोग से बनने वाले टुकड़ों को कैश करता है getItem। मैं एक ही मुद्दे का सामना कर रहा था- फोन करने के बाद भी कॉल notifyDataSetChanged() getItemनहीं किया जा रहा था।

यह वास्तव में एक विशेषता है और बग नहीं है। आपको ओवरराइड करने की आवश्यकता है getItemIdताकि आप अपने टुकड़ों का सही उपयोग कर सकें। जब से आप अंश निकाल रहे हैं, आपकी स्थिति बदल रही है। डॉक्स में उल्लिखित:

long getItemId (int position)

दिए गए स्थान पर आइटम के लिए एक विशिष्ट पहचानकर्ता लौटाएं।

डिफ़ॉल्ट कार्यान्वयन दी गई स्थिति देता है। यदि वस्तुओं की स्थिति बदल सकती है, तो उपवर्गों को इस विधि को ओवरराइड करना चाहिए।

बस प्रत्येक टुकड़े को एक अद्वितीय आईडी प्रदान करें और आप कर रहे हैं।

एक का उपयोग करना FragementStatePagerAdapterया वापस लौटने POSITION_NONEमें int getItemPosition (Object object)गलत है। आपको कोई कैशिंग नहीं मिलेगी।


यह एक सही जवाब था। मुझे अंशों के लिए अलग-अलग आईडी प्रदान करनी थी getItemIdऔर अगर खंड को हटा दिया जाना चाहिए, तो getItemPositionवापस लौटने के लिए समायोजित करें POSITION_NONE। मेरे पास उसके लिए एक एनुम झंडा है। उसके बाद getItemबुलाया जाएगा।
मुरात करागोज

आप के लिए +50 :) @ MuratKaragöz धन्यवाद
वेदांत

5

मैंने वही किया जो @kanika और @ Jraco11 ने पोस्ट किया था लेकिन मुझे अभी भी समस्या थी।

इसलिए, बहुत सारे बदलावों के बाद, मैंने पाया कि मेरे लिए काम किया और अगले कोड में मेरे FragmentPagerAdapter में जोड़ा गया:

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

मैंने जो पढ़ा है, उसके अनुसार, GetPemPosition का उपयोग ViewPager को सूचित करने के लिए किया जाता है कि क्या किसी आइटम को रिफ्रेश करना है या नहीं, और अपडेट से बचने के लिए यदि दृश्य स्थिति में आइटम नहीं बदले हैं।


2

दो अलग-अलग परिदृश्य हैं: 1.) आपके पास प्रत्येक पेजर के लिए एक ही लेआउट है: उस स्थिति में, यह बेहतर होगा यदि आप पेजर एडेप्टर द्वारा अपने कस्टम एडेप्टर का विस्तार करेंगे और एकल लेआउट लौटाएंगे।

2.) आपके पास हर पेजर के लिए अलग-अलग लेआउट हैं: उस स्थिति में, यह बेहतर होगा कि आप अपने कस्टम एडॉप्टर को FragmentStatePagerAdapter द्वारा बढ़ाएँ और हर पेजर के लिए अलग-अलग फ्रेम्स लौटाएँ।


2

विधि getItem()का उपयोग केवल नई वस्तुओं को बनाने के लिए किया जाता है। एक बार उन्होंने बनाने के बाद, इस विधि को नहीं कहा जाएगा। यदि आपको एडॉप्टर द्वारा उपयोग में आने वाली वस्तु प्राप्त करने की आवश्यकता है, तो इस विधि का उपयोग करें:

pagerAdapter.instantiateItem(viewPager, TAB_POS)

0

मैंने पाया कि टैब-लेआउट पर एक श्रोता को सेट करने से यह कहा जा रहा है, शायद इसलिए कि उनके पास श्रोताओं tabLayout.setOnTabSelectedListenerकी एक सरणी के बजाय केवल एक श्रोता के लिए जगह है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.