2014-04-17 6 views
10

में कैश किए गए टुकड़े अपडेट करें मेरे पास एक व्यूपेजर है जिसमें इसके खंड के अंदर कई टेक्स्ट व्यू हैं जिनमें उनके अलग-अलग फ़ॉन्ट आकार हैं। इसके अलावा, मुझे फ़ॉन्ट आकार को बढ़ाने/घटाने के लिए बटन मिलते हैं जो प्रत्येक डिफ़ॉल्ट आकार के फ़ॉन्ट आकार की गणना करते हैं, इसके डिफ़ॉल्ट आकार को जोड़कर एक मूल्य जिसे STEP कहा जाता है (जो inc/dec font size बटन द्वारा बदलता है)।
मेरी समस्या यह है कि यदि आकार परिवर्तन लागू करने के बाद पहली बार दृश्य प्रदर्शित होता है, तो यह क्रिएटिव व्यू() के दौरान वांछित आकार में टेक्स्ट व्यू बनाएगा, हालांकि अगर खंड पहले से ही कैश किया गया था और क्रिएटिव्यू को फिर से कॉल नहीं किया गया है, तो मुझे नहीं पता कि अपडेट कैसे करें उनके पाठ दृश्यों में से केवल एक कैश्ड टुकड़े पर विचार कर रहा है स्क्रीन पर प्रदर्शित होता है (और मैं इसे बिना किसी समस्या के अपडेट कर सकता हूं) लेकिन अन्य प्रदर्शित नहीं होते हैं (मुझे नहीं पता कि वे गतिविधि से जुड़े हैं या नहीं, इस मामले में नहीं)।
दूसरे शब्दों में मैं कैसे पता लगा सकता हूं कि ViewPager द्वारा कौन से टुकड़े कैश किए जाते हैं और उनके ऑनक्रेट व्यू को पहले से ही बुलाया जाता है (ये वे टुकड़े हैं जो उनके विचारों के लिए अपडेट किए जाने चाहिए)। अपने ViewPager एडाप्टर के लिए enter image description hereएंड्रॉइड व्यूपेजर: ऑफ-स्क्रीन अपडेट करें लेकिन व्यूपेगर

उत्तर

9

आदेश ViewPager द्वारा कैश मदों की एक सूची रखने के लिए मुझे अपने कस्टम जो एक विस्तार एडाप्टर बदल: मैं नीचे चित्र में प्रश्न चिह्न के साथ हल्के हरे रंग में उन्हें चिह्नित FragmentStatePagerAdapter:

  1. मेरी एडाप्टर के लिए एक HashMap<Integer, FragmentDipsplayPageContent> cachedFragmentHashMap जोड़े
  2. अद्यतन GetItem() विधि इस

    की तरह अंदर इस संग्रह का उपयोग कर

    public HashMap<Integer, FragmentDipsplayPageContent> getCachedFragmentHashMap() { 
        return cachedFragmentHashMap; 
    } 
    
  3. अद्यतन:

    public Fragment getItem(int index) {   
        Fragment fragment = new FragmentDipsplayPageContent(); 
        Bundle args = new Bundle(); 
        args.putInt("INDEX", index); 
        fragment.setArguments(args); 
        cachedFragmentHashMap.put(index,fragment); 
        return fragment; 
    } 
    
  4. अद्यतन destroyItem() इस

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
        super.destroyItem(container, position, object); 
        //add this line to remove fragments wiped from ViewPager cache 
        cachedFragmentHashMap.remove(position); 
    } 
    
  5. तरह एडाप्टर के विधि गतिविधि से कैश की गई टुकड़े का HashMap तक पहुँचने के लिए गेटर जोड़े गतिविधि:

    private void increaseFontSizeForCachedFragments() { 
        HashMap<Integer, FragmentDipsplayPageContent> cachedFragmentsHashMap = adapterViewPager 
          .getCachedFragmentHashMap(); 
        Collection<FragmentDipsplayPageContent> fragmentsCollection = cachedFragmentsHashMap 
          .values(); 
        for (FragmentDipsplayPageContent fragmentDipsplayPageContent : fragmentsCollection) { 
         //update views of fragment 
         fragmentDipsplayPageContent.increasTextFontSize(); 
        } 
    } 
    


    इस तरह सभी कैश किए गए टुकड़े दृश्यमान और ऑफ-स्क्रीन टुकड़े सहित अपडेट किए गए हैं।

7

उपयोग FragmentStatePagerAdapter बजाय FragmentPagerAdapter

+0

मैं वर्तमान में FragmentStatePagerAdapter का उपयोग कर रहा हूं। – VSB

+0

अच्छी तरह से, यह मेरे लिए काम किया और मेरा समय बचाया। बहुत बहुत धन्यवाद! – mohnage7

+0

क्लाइंट पेजर का उपयोग कर पेजर का उपयोग कर रहा था ... और यह ऑनलाइन डेटा के उचित आकार को लोड कर रहा था, इसलिए यह 30+ पृष्ठों के बाद लटक रहा था। .. इस समाधान के लिए धन्यवाद। –

22

स्वीकृत उत्तर अच्छा है लेकिन आपको सभी वस्तुओं को कैश नहीं करना चाहिए। इसके बजाय, आप इस विधि का उपयोग कर सकते हैं:

mViewPager.setOffscreenPageLimit(int); 

उदाहरण के लिए, छवि और एनिमेशन के साथ कई आइटम हैं। यदि आप उन सभी को कैश करते हैं, तो शायद यह OutOfMemoryError के साथ परिणाम देगा। रोकने के लिए, आप पृष्ठ सीमा को कैश किए जाने के लिए परिभाषित कर सकते हैं।

संपादित करें: इसके बजाय HashMap<Integer, Object>, SparseArray<Object> का उपयोग करना बेहतर है।

+2

सवाल यह है कि कैसे कैशिंग सक्षम किया गया है, हालांकि जब वे दिखाई नहीं दे रहे हैं तो अपडेट के लिए कैश किए गए आइटम तक पहुंच सकते हैं। – VSB

+0

डिफ़ॉल्ट आकार क्या है? – Relm

+0

यदि आप इस समाधान का उपयोग करते हैं तो आप कैश में स्क्रीन कैसे हटाते हैं? मेरे पास अभी यह समस्या है क्योंकि कैश पेज अपडेट नहीं होते हैं। –

संबंधित मुद्दे