ऑफ़-स्क्रीन दृश्यों को नष्ट करने से ViewPager को रोकें


133

मेरे पास एक ViewPager है, जो तीन टुकड़े प्रदर्शित कर रहा है, जो एक FragmentPagerAdapter के लिए झुका हुआ है। ViewPager होस्ट किए गए टुकड़े के दृश्य को तब नष्ट करता दिखाई देता है जब वह वर्तमान स्थिति से एक से अधिक स्वाइप हो।

ये दृश्य सभी सरल सूचियां हैं और यह अनुकूलन पूरी तरह से अनावश्यक है, इसलिए मैं इसे अक्षम करना चाहूंगा। यह कुछ दृश्य समस्याएं पैदा कर रहा है क्योंकि सूचियों में उनके लिए लागू लेआउट एनिमेशन हैं और उन एनिमेशनों को नष्ट होने और फिर से बनाए जाने के बाद फिर से देखा जा रहा है। यह हर बार स्क्रॉलबार इंट्रो एनीमेशन दिखाता है (जहां स्क्रॉलबार यह इंगित करने के लिए संक्षिप्त रूप से दिखाई देता है कि स्क्रॉल करना संभव है) जो विचलित करने वाला हो सकता है, और उपयोगकर्ता की वर्तमान स्क्रॉल स्थिति प्रक्रिया में खो जाती है।

यह तीसरा टुकड़ा लोड नहीं करता है जब तक कि पहला स्वाइप नहीं होता है, जो समस्याग्रस्त है क्योंकि प्रत्येक टुकड़ा अपनी सेवा कॉल को संभालता है और मैं गतिविधि लोड होने पर एक ही समय में सभी तीन फायर बंद करना पसंद करूंगा। तीसरी सेवा कॉल में देरी होना आदर्श से कम है।

क्या इस व्यवहार को रोकने के लिए ViewPager को समझाने और स्मृति में मेरे सभी टुकड़े रखने का कोई तरीका है?

जवाबों:


332

में संशोधन 4 सहायता पैकेज की, एक विधि ViewPager जो बल्कि डिफ़ॉल्ट जो 1 है की तुलना में, आप उपयोग करने के लिए गुप्त पृष्ठों की संख्या निर्दिष्ट कर सकते हैं करने के लिए जोड़ा गया है।

अपने मामले में, आप 2 निर्दिष्ट करना चाहते हैं, ताकि जब आप तीसरे पृष्ठ पर हों, तो पहले वाला नष्ट न हो, और इसके विपरीत।

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

किसी भी विचार कैसे एक coverflow पर यह करने के लिए?
जोसेफ

4
हैलो। मैं जिस पर काम कर रहा हूं, उसके टुकड़े / पृष्ठ गतिशील रूप से निर्मित हो जाते हैं इसलिए संभावित टुकड़ों की अनिश्चित संख्या होती है। यह मामला, यह आमतौर पर 10 या उससे कम हो जाता है। क्या इस समाधान का उपयोग करने के लिए स्मृति का इतना अधिक उपयोग नहीं किया जाएगा? टुकड़े केवल दृश्य धारण करेंगे, वैसे। धन्यवाद!
महकी

यह विधि फेंकता है: "java.lang.IllegalStateException: पहले से ही जोड़ा गया टुकड़ा:" मेरे ऐप के लिए त्रुटि।
एलिकनबैट

बहुत बहुत धन्यवाद। यह वास्तव में काम किया है। मुझे भी @chefgon जैसी ही समस्या थी।
प्रशांत

@mahie उपरोक्त समाधानों के लिए यदि यह एक अनुकूलन के रूप में पेश किया जाता है। यदि आपको पहले से पता है कि पृष्ठों की संख्या * आपको अपने पृष्ठों पर * आलसी-लोडिंग तंत्रों का समर्थन करने की आवश्यकता है या आपके पेजों पर लेज़र-लोडिंग मैकेनिज़्म हैं, तो इस सेटिंग को साझा करने वाले एनिमेशन और इंटरैक्शन की कथित चिकनाई में लाभ हो सकता है। यदि आपके पास पृष्ठों की एक छोटी संख्या (3-4) * है जिसे आप एक ही बार में सक्रिय रख सकते हैं, तो कम समय के लिए लेआउट में बिताया जाएगा * नए बनाए गए दृश्य उपशीर्षक के रूप में उपयोगकर्ता पृष्ठ आगे और पीछे
Asthme

8

डिफ़ॉल्ट रूप से, जब आप पृष्ठ को स्वाइप करते हैं, तो ViewPager टुकड़ों को फिर से बनाता है। इसे रोकने के लिए, आप दो चीजों में से एक को आजमा सकते हैं:

1. अपने अंशों के onCreate () में, setRetainInstance (सत्य) को कॉल करें।

2. यदि टुकड़ों की संख्या निश्चित और अपेक्षाकृत कम है, तो अपने ऑनक्रिएट () में निम्नलिखित कोड जोड़ें:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

अगर मुझे सही याद है, तो दूसरा विकल्प अधिक आशाजनक है। लेकिन मैं आपसे आग्रह करता हूं कि दोनों कोशिश करें और देखें कि उनमें से कौन सा काम करता है।


3

"किसी निष्क्रिय अवस्था में दृश्य पदानुक्रम में वर्तमान पृष्ठ के दोनों ओर बनाए रखने वाले पृष्ठों की संख्या सेट करें। इस सीमा से परे पृष्ठ जरूरत पड़ने पर एडेप्टर से पुनः बनाए जाएंगे।"

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

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