2014-09-25 4 views
6

instantiated है मैं जानता हूँ कि मैं कर सकता हूँएंड्रॉयड - ViewPager एडाप्टर, अनुकूलक से पहले प्राथमिक आइटम सेट

viewPager.setCurrentItem(position) 

इच्छित स्थान पर मेरे विचार पेजर स्थापित करने के लिए। मेरा सवाल यह है कि एडाप्टर तत्काल होने से पहले मैं और कैसे कर सकता हूं।

मतलब है कि अगर मैं ऐसा

pagerAdapter = new ViewPagerAdapter(arg1,arg2....); 
viewPager.setAdapter(pagerAdapter); 
viewPager.setCurrentItem(position); 

आइटम 0 पहले निर्माण है और उसके बाद इच्छित स्थान पर आइटम भी निर्माण कर रहा है। जो समय को दोगुना लगता है ... मेरे एडाप्टर में प्रत्येक आइटम को बनाने के लिए बहुत सारे काम की ज़रूरत होती है, इसलिए यदि संभव हो तो 0 स्थिति आइटम को बनाने से बचाना सबसे अच्छा होगा। शायद एडाप्टर के तत्कालता पर एक तर्क के रूप में वांछित स्थिति पारित करके ...?

ऐसा करने का कोई तरीका?

उत्तर

1

पर आप viewpager मूर्ख दी गई स्थिति पर शुरू करने के लिए कर सकते हैं इससे पहले कि अनुकूलक onRestoreInstanceState बुला, इस तरह से, सेट है:

int currentItem = 5; 

Parcel parcel = Parcel.obtain(); 
writeParcelable(BaseSavedState.EMPTY_STATE, 0); 

writeInt(currentItem); 
writeParcelable(null, 0); 

setDataPosition(0); 
SavedState savedState = ViewPager.SavedState.CREATOR.createFromParcel(parcel); 

mPager.onRestoreInstanceState(savedState); 

mPager.setAdapter(mAdapter); 
+0

दुर्भाग्यवश यह एंड्रॉइड एम में अब और काम नहीं करता है, मेरा नया उत्तर –

+0

एंड्रॉइड एम के साथ काम करने के लिए अपडेट किया गया –

3

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

0

आप इस चाल कर सकते हैं:

refactor एक समारोह में अपने भारी काम के सभी, क्योंकि एक fragment बनाने नहीं है ज्यादा समय लगता है, और केवल कि कार्यप्रणाली को कॉल करके समारोह निष्पादित जब उपयोगकर्ता इसे देखने के लिए जा रहा है OnPageChangeListener श्रोता के अंदर और

@Override 
public void onPageSelected(int position){ 
    // call your function that do heavy working 
} 
1

एक समाधान है कि Android एम के साथ-साथ पुराने संस्करणों, उपयोग प्रतिबिंब में काम करता है के रूप में इस के लिए: क्योंकि आप ViewPager कार्यान्वयन को नियंत्रित (यह आपके अनुप्रयोग के साथ शामिल किया गया है)

int currentItem = 5; 

// Set initial position first... 
Field field = ViewPager.class.getDeclaredField("mRestoredCurItem"); 
field.setAccessible(true); 
field.set(mPager, currentItem); 

// ...and then set adapter 
mPager.setAdapter(adapter); 

का उपयोग प्रतिबिंब, सुरक्षित है।

आप Proguard का उपयोग करते हैं, तो आप अपने config में निम्नलिखित को शामिल करने की जरूरत है:

-keepclassmembers class android.support.v4.view.ViewPager { 
    private int mRestoredCurItem; 
} 

या क्षेत्र mRestoredCurItem Proguard से बदल दिया जाएगा।

3

आप केवल खाली एडाप्टर सेट कर सकते हैं और उसके बाद अपना असली एडाप्टर इस तरह सेट कर सकते हैं कि आप व्यूअरजर को "चाल" देंगे और आप जिस डेटा को नहीं चाहते हैं उसे लोड करना चाहते हैं।

this.viewPager.setAdapter(new PagerAdapter() { 
     @Override 
     public int getCount() { 
      return 0; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) { 
      return false; 
     } 
    }); 
this.viewPager.setCurrentItem(imagePosition, false); 
this.viewPager.setAdapter(adapter); 
this.viewPager.setCurrentItem(imagePosition, false); 
संबंधित मुद्दे