2012-08-17 8 views
13

मैं एक पेजर एडाप्टर का उपयोग करता हूं। मेरे पास बहुत सारे तत्व हैं इसलिए मैं एक ही समय में सभी तत्वों को लोड नहीं करता हूं। मैं एडाप्टर को पुनः लोड करता हूं, मैं पुराने तत्वों को नए तत्वों से बदलता हूं। उदाहरण के लिए मेरे पास 4 तत्व हैं, जब मैं अंतिम तत्व पर पहुंचता हूं, तो मैं तत्वों को फिर से लोड करता हूं और मैं setCurentItem (1) को कॉलपेजर को स्थिति में दिखाने में सक्षम होने के लिए कॉल करता हूं। मैंने बहुत सारे परीक्षण किए हैं। मैं डाल:ViewPurrentItem ViewPager में सही स्थिति में तुरंत स्क्रॉल नहीं

viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page. 
viewPager.setCurrentItem(1); 

मैं onPageScrollStateChanged (पूर्णांक arg0) को संशोधित करने की कोशिश की है, मैं सिर्फ 3 बार देखा गया है और हमेशा बीच में ubicate।

if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) { 
    if(focusedPage==2) { 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 

    }else if(focusedPage==0){ 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 
    } 

और मैं onPageSelected (पूर्णांक arg0)

focusedPage=arg0; 

संशोधित करने के लिए यह पिछले उदाहरण मैं तुरंत विचारों स्क्रॉल लेकिन हमेशा यह अंतिम पृष्ठ पर स्थित है का उपयोग करना tryed है। कोई भी जानता है कि मैं कैसे स्लाइड कर सकता हूं।

आप

उत्तर

43

मैं तुम्हें क्या हासिल करने की कोशिश कर रहे हैं की पृष्ठभूमि के बारे में अधिक पता कर सकते हैं धन्यवाद?

वैसे भी, जो मैं समझ सकता हूं उससे आप "अनंत" ViewPager को अंतिम से पहले तक जा रहे हैं और इसके विपरीत (अगर मैं गलत हूं तो कृपया मुझे सही करें)। और आप पहले पेज पर जाने के लिए अपने ViewPager चाहते हैं लेकिन स्क्रॉलिंग - न कहीं से दिखाई दे रहे हैं।

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

/*No swipe animation, and no onPageChanged for the page in the middle*/ 
    mPager.setCurrentItem(1, false); 

    /*The same as if you do not add the second parameter*/ 
    mPager.setCurrentItem(1, true); 

    /*Your ViewPager scrolls through all the needed views until it arrives at that view.*/ 
    mPager.setCurrentItem(1); 

क्या मैं इसे ध्यान में रखकर आप के लिए सिफारिश कर सकते हैं कि आप पदों 0 पर "डमी" देख सकते हैं और "पिछले" और दृश्य जोड़ने के लिए स्थिति 0 में पिछले "स्थिति के रूप में ही किया जाएगा कोशिश कर सकते हैं है - 1 "और" अंतिम "दृश्य स्थिति" 1 "जैसा ही होगा। तो आप सबकुछ सामान्य करेंगे, इसके अलावा, OnPageChangeListener पर आप जांच लेंगे कि वर्तमान पृष्ठ "0" या "आखिरी" स्थिति है और यदि यह है, तो आप setCurrentItem ("1", false) या setCurrentItem ("last - 1 ", झूठा) इस आधार पर कि आप किस स्थिति में हैं। इस तरह आप जो चाहते हैं उसे पूरा करते समय आप "पृष्ठ परिवर्तन" प्रभाव बनाए रखेंगे।

मुझे आशा है कि यह आपकी समस्या से आपकी मदद कर सकता है।

नोट: के बाद यह नई स्थिति पर पहुंचने एक laggy परिवर्तन हो सकता है, क्योंकि यह वर्तमान अगले और पिछले विचारों के लिए दृश्य लोड करने में करना होगा (या यदि आप 4.0+ पर तो कर रहे हैं कहीं भी होगी केवल वास्तविक स्थिति लोड करें)।

अद्यतन:

ViewPager mPager = new ViewPager(); 
mPager.getAdapter().notifyDataSetChanged(); //This notify that you need to recreate the views 

/*This is if you want to change the data and then go to a specific position 
If you do not do this you will have a very Buggy Behavior*/ 
new Handler().post(new Runnable() { 
@Override 
public void run() { 
    mPager.setCurrentItem(2); //Where "2" is the position you want to go 
    } 
}); 

अद्यतन 2:

आप सूची/सरणी कि ViewPager की सामग्री को निर्धारित की सामग्री को बदल हैं, तो आप कॉल करने की आवश्यकता

आप अपने सभी तत्वों को ViewPager पर क्यों नहीं जोड़ते? ViewPager में पहले से ही उन मामलों को संभालने के लिए अनुकूलन है, मेरे मामले में मेरे पास बहुत सारे तत्व हैं और यह एक आकर्षण की तरह काम कर रहा है।

एक और बात, आपके कोड में मैं देखता हूं कि जब भी कोई पृष्ठ "निपटान" होता है तो आप मध्य पृष्ठ में बदल जाते हैं। लेकिन फिर आप वास्तव में सही और बाएं दृश्य को कभी नहीं दिखाते हैं, तो आपके पास क्यों है?

अंतिम बात, जब आप अपना डेटासेट बदलते हैं तो आपको उपरोक्त वर्णित "अधिसूचनाडेटाट चेंज" विधि को कॉल करने की आवश्यकता होती है, और फिर आप एक हैंडलर के अंदर "setCurrentItem" विधि को कॉल करते हैं। यदि आप नहीं करते हैं, तो आपका ऐप अपेक्षित काम नहीं करेगा।

अद्यतन 3:

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

यदि आपके पास यह प्राप्त करने के बारे में कोई अन्य प्रश्न है तो पूछने में संकोच नहीं करें।

अद्यतन 4:

शायद ज़रुरत पड़े किसी को वास्तव में एक परिपत्र ViewPager की तलाश में है, मैं एक proof of concept code है कि आप फिर से उपयोग कर सकते हैं जोड़ा। यह बिना किसी समस्या के काम करता है और मैंने इसे जटिल विचारों के साथ उपयोग किया है और अभी भी कोई अंतराल नहीं है।

+0

धन्यवाद @Jorge एग्विलार। मैंने आपके विचार का उपयोग किया है, लेकिन मैंने कुछ चीजें बदल दी हैं। मैंने "डमी" दृश्य जोड़ा है लेकिन मैंने अलग-अलग विचार डाले हैं। उदाहरण के लिए, यदि मेरे पास ए, बी, सी, डी, ई है। मैंने पहली बार रखा है: ए, ए, ए। और setCurrentItem (1, झूठा)। जब उपयोगकर्ता अगले व्यूपैज़र पर स्क्रॉल करता है, तो यह है: ए, बी, सी और सेटक्रेंटेंटम (1, झूठा), ... ऑनपेजस्क्रॉलस्टेट में मैंने इस कोड को रखा है। लेकिन अब मुझे एक छोटी सी समस्या है। यदि उपयोगकर्ता जल्दी से स्क्रॉल करना चाहता है, तो वे ऐसा नहीं कर सकते क्योंकि कोई देरी हो रही है। क्या तुम्हारे पास कोई विचार है? धन्यवाद – MARM

+0

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

+0

मैंने अपना प्रश्न संपादित किया है। – MARM

1

यह एक postDelayed बिना काम नहीं करता, इस कोड के साथ प्रयास करें:

viewPager.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     viewPager.setCurrentItem(num, true); 
    } 
}, 100); 
संबंधित मुद्दे