2012-05-13 16 views
9

के अंदर टुकड़े संदर्भित करना मुझे एक ViewPager के अंदर मेरे टुकड़ों को संदर्भित करने में समस्या है। मैं ऐसा करना चाहता हूं क्योंकि मेरी गतिविधि से मैं एक निर्दिष्ट स्थिति (जैसे वर्तमान में प्रदर्शित खंड) पर एक टुकड़ा ताज़ा करना चाहता हूं।ViewPager

वर्तमान में मैं कुछ इस तरह है:

public static class MyPagerAdapter extends FragmentPagerAdapter { 

    private static final String TAG = "MyPagerAdapter"; 
    private static HashMap<Integer, EventListFragment> mPageReferenceMap = new HashMap<Integer, EventListFragment>(); 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Log.i(TAG, "getItem: "+position); 
     int dateOffset = position-1; 
     EventListFragment mFragment = EventListFragment.newInstance(dateOffset); 
     mPageReferenceMap.put(position, mFragment); 
     return mFragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     Log.i(TAG, "destroyItem: "+position); 
     mPageReferenceMap.remove(position); 
     super.destroyItem(container, position, object); 
    } 


    public EventListFragment getFragment(int key) { 
     Log.i(TAG, "Size of pager references: "+mPageReferenceMap.size()); 
     return mPageReferenceMap.get(key); 
    } 
} 

समस्या यह है कि destroyItem() अधिक बार getItem() से बुलाया जाता है, इसलिए मैं अशक्त संदर्भ के साथ छोड़ दिया हूँ। यदि मैं नष्ट टुकड़ों के संदर्भों को साफ़ करने के लिए destroyItem() का उपयोग नहीं करता ... अच्छी तरह से मैं उन टुकड़ों का संदर्भ देता हूं जो मौजूद नहीं हैं।

EventListFragment mFragment = EventListFragment.newInstance(dateOffset); के साथ बनाए गए टुकड़ों को संदर्भित करने का कोई अच्छा तरीका है? या मेरी गतिविधि से व्यूपेजर के अंदर एक टुकड़े को ताज़ा करने के लिए मुझे क्या करना चाहिए (विकल्प मेनू से सटीक होना)?

उत्तर

5

मैं इसे हल करने में कामयाब रहा। चाल गतिविधि के अंदर एक संदर्भ सूची बनाना था, पेजर एडाप्टर नहीं। यह इस प्रकार है:

List<WeakReference<EventListFragment>> fragList = new ArrayList<WeakReference<EventListFragment>>(); 

@Override 
public void onAttachFragment (Fragment fragment) { 
    Log.i(TAG, "onAttachFragment: "+fragment); 
    if(fragment.getClass()==EventListFragment.class){ 
     fragList.add(new WeakReference<EventListFragment>((EventListFragment)fragment)); 
    } 
} 
public EventListFragment getFragmentByPosition(int position) { 

    EventListFragment ret = null; 
    for(WeakReference<EventListFragment> ref : fragList) { 
     EventListFragment f = ref.get(); 
     if(f != null) { 
      if(f.getPosition()==position){ 
       ret = f; 
      } 
     } else { //delete from list 
      fragList.remove(f); 
     } 
    } 
    return ret; 

} 
बेशक

अपने टुकड़ा एक getPosition() समारोह कार्यान्वित करना होगा, लेकिन मैं कुछ इस तरह वैसे भी जरूरत है, तो यह एक समस्या नहीं था।

धन्यवाद WeakReference के साथ आपके सुझाव के लिए एलेक्स लॉकवुड!

+0

मैंने अभी अपना फाइनल समाप्त कर लिया है और वापस आने का फैसला किया है और देखें कि क्या आपको काम मिल रहा है ... खुशी है कि मैं मदद करने में सक्षम था (भले ही यह मुख्य समस्या के साथ नहीं था: पी)। –

+0

प्रश्न: fragList.remove() कॉल को टुकड़े की बजाय कमजोर संदर्भ पारित नहीं किया जाना चाहिए? – gcl1

+0

@ माइकल: मैंने इस तरह के दृष्टिकोण का उपयोग करना शुरू किया, और यह बहुत अच्छी तरह से काम करता है। लेकिन चूंकि खंडसूची में कमजोर संदर्भ हैं, ऐसा लगता है कि प्रविष्टियां कचरा संग्रह के अधीन हैं, भले ही आपको अभी भी उनकी आवश्यकता हो। मैंने getFragmentByPosition() विधि को कभी-कभी शून्य वापस कर दिया है, इसलिए मुझे लगता है कि यह हो रहा है। कोई विचार है कि उसके आसपास कैसे जाना है? धन्यवाद। – gcl1

3

दो बातें:

  1. अपनी गतिविधि के onCreate विधि निम्नलिखित पंक्ति जोड़ (या जहाँ भी आप प्रारंभ अपने ViewPager):

    mPager.setOffscreenPageLimit(NUM_ITEMS-1); 
    

    यह स्मृति में अतिरिक्त ऑफ स्क्रीन पृष्ठों रखेंगे (यानी उन्हें नष्ट होने से रोकना), भले ही वे स्क्रीन पर दिखाए जा रहे हों।

  2. आप को लागू करने पर विचार हो सकता अपने HashMap इतना है कि यह Fragment बजाय WeakReference<Fragment> रों रखती है खुद को है। ध्यान दें कि यह आप अपने getFragment प्रक्रिया में परिवर्तन करना इस प्रकार की आवश्यकता होगी:

    WeakReference<Fragment> weakRef = mPageReferenceMap.get(position); 
    return (weakRef != null) ? weakRef.get() : null; 
    

    यह आपकी समस्या से कोई लेना-देना नहीं है ... यह सिर्फ कुछ मैंने देखा और सोचा कि मैं आपके ध्यान में लाना होगा है। WeakReferences को अपने Fragment एस पर रखने से आपको कचरा कलेक्टर की पहुंच क्षमता निर्धारित करने की क्षमता मिल जाएगी, इसलिए आपको इसे स्वयं करने की ज़रूरत नहीं है।

+0

के लिए 2. => यह मेरी समस्या का समाधान नहीं करेगा, लेकिन शायद लीक को रोकने के लिए एक अच्छा विचार है, धन्यवाद। और 1. => मेरे पास 7 पेज होंगे, शायद भविष्य में, क्या उन्हें एक ही समय में स्मृति में रखना ठीक है? –

+0

हम्म ... अच्छी तरह से कम 'फ्रैगमेंट' आप स्मृति में बेहतर रख रहे हैं। यदि आप अपनी 'गतिविधि' के भीतर मांग पर अपनी 'फ्रैगमेंट की मांग' तक पहुंचना चाहते हैं (वास्तव में 'फ्रैगमेंट के पेज पर स्विच किए बिना) w/o उन्हें स्मृति में रखते हुए, फिक्स एक ट्रिकियर होगा। इसे 'व्यूपागर' स्रोत कोड में खोदने की आवश्यकता हो सकती है और यह देखकर कि यह 'फ्रैगमेंट' लाइफसाइकिल को कैसे प्रबंधित करता है। मुझे ऐसा करने के किसी भी तरीके से अवगत नहीं है, लेकिन जब मैं अधिक समय लेता हूं तो मैं इसे देख लूंगा। –

+0

मई नम्रता से सुझाव दे सकता हूं कि यदि कुछ भी है, तो आपको किसी भी प्रकार की फ्रैगमेंट से ऑफस्क्रीन होने की आवश्यकता है, शायद आपको इसे फ्रैगमेंट नहीं देनी चाहिए।इसे किसी सेवा या ContentProvider में डालने पर विचार करें, और अपने टुकड़े को क्लाइंट बनने दें। – Sparky