एक ViewPager की वर्तमान स्थिति प्राप्त करना


84

मुझे पता है कि गैलरी विजेट के साथ मैं getSelectedItemPosition () का उपयोग करने में सक्षम था; वर्तमान स्थिति को पुनः प्राप्त करने के लिए, हालांकि यह नहीं लगता है कि ViewPager के पास है।

मुझे पता है कि मैं एक श्रोता को सेटअप कर सकता हूं और पृष्ठ स्विच किए जाने पर स्थिति को पुनः प्राप्त कर सकता हूं। लेकिन मैं वर्तमान दृश्य स्थिति चाहता हूं।

जवाबों:


94

एक श्रोता बनाएँ और इसे अपने व्यूपेजर पर सेट करें:

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}

4
इसका उपयोग करते समय बस जागरूक रहें: getCurrentPage () हमेशा 0 वापस आएगा जब दृश्य कभी नहीं बदला गया हो। किसी कारण से यदि आप पहले दृश्य के अलावा किसी अन्य दृश्य पर व्यू पेजर में प्रवेश करते हैं, तो आपके द्वारा अपेक्षित मान 0 नहीं होना चाहिए ... मैं इसके साथ एक समस्या में भाग गया क्योंकि मैंने हमेशा पहले पर दृश्य दर्ज नहीं किया था राय।
ब्रैंडन रोमानो

1
@ अदम यू प्लीज बता सकते हैं कि कैसे इस फंक्शन को कॉल किया जाए getCurrentPage
user3233280

यह बहुत सरल है। धन्यवाद u androidu
whdals0

193

आप उपयोग कर सकते हैं:

mViewPager.getCurrentItem()

ViewPager में कोई विधि getCurrentItem नहीं है
दिमित्री


3
मुझे माफ कर दो मैं गलत था। बस मेरी सपोर्ट लाइब्रेरी को अपडेट किया और यह तरीका नए संस्करण में मौजूद है
दिमित्री गुसेलनिकोव

4

अपडेट 2019

अब आप addOnPageChangeListenerपृष्ठ स्थिति में परिवर्तन को देखने के लिए पेजर पर सेट कर सकते हैं ।

चूंकि आप एक श्रोता को सेटअप करना चाहते थे और पृष्ठ स्विच किए जाने पर स्थिति को पुनः प्राप्त करते हैं

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })

0

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


पहले, थोड़ी जानकारी। यदि आप एक ViewPager के सभी बच्चों के साथ पुनरावृति करते हैं ViewPager.getChildAt(x);और प्रत्येक बच्चे के साथ toString()(या getLeft()) प्रिंट करते हैं (या एक पृष्ठ देखें) और फिर हर बार जब आप पृष्ठ बदलते हैं, तो आप देखेंगे कि बच्चे उस तार्किक क्रम में नहीं होंगे जो वे प्रदर्शित होते हैं जब आप पृष्ठ वापस जाने लगते हैं (शुरुआत में वापस पेजिंग)। जाहिरा तौर पर, यह अनावश्यक बच्चे को सरणी से हटा देगा और फिर नए बच्चे को सरणी में जोड़ देगा। इसलिए, उदाहरण के लिए, हम कहते हैं कि आप पृष्ठ 2 को देख रहे हैं, फिर पृष्ठ 3 में बदल गया है, आपके बच्चों की सूची इस क्रम में होगी page 2, page 3, page 4जिसका अर्थ है कि ViewPager.getChildAt(1);वर्तमान पृष्ठ वापस आ जाएगा। लेकिन, यदि आप फिर से पेज 2 पर वापस आते हैं (पेज 3 से) तो आपके बच्चों की सूची इस क्रम में होगी page 2, page 3, page 1जिसका अर्थ हैViewPager.getChildAt(1);वर्तमान पृष्ठ वापस नहीं करता है। मैं अभी तक इस जानकारी का उपयोग करके वर्तमान पृष्ठ को निकालने के लिए सरल तर्क खोजने में सक्षम नहीं हूं। क्योंकि getChildAtउपयोगकर्ता के आसपास पेजिंग कैसे की गई है, इस आधार पर सरणी में पृष्ठों का क्रम एक अनियंत्रित क्रम में है।

कहा जा रहा है, मैंने एक हैक काम विकसित किया है। मुझे कोई सुराग नहीं है अगर यह फ़ंक्शन सभी वातावरण में काम करेगा, लेकिन यह मेरी वर्तमान परियोजना के लिए काम करता है। मुझे संदेह है कि अगर आपके लिए नहीं है, तो इसका अलग एपीआई स्तर का मुद्दा है। लेकिन मुझे वास्तव में अन्य वातावरणों के लिए किसी भी मुद्दे पर संदेह नहीं है।

अब, मांस पर। मैंने देखा कि ViewPager.getChildAt(x).getLeft()माता-पिता के सापेक्ष क्षैतिज पिक्सेल का किसी प्रकार का परिणाम होगा। इसलिए, मैंने इस जानकारी का उपयोग खरपतवार के लिए किया है जो वर्तमान में है।

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

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

क्यों (आप पूछ सकते हैं) मैंने सिर्फ onClickListenterया जो भी समाधान का उपयोग नहीं किया ? ठीक है, मुझे यह निर्धारित किया गया था कि श्रोताओं, अन्य वर्गों, अनिर्णायक फोकस और अन्य ब्लोट को शामिल किए बिना ऐसा करने के लिए एक सीधा आगे रास्ता था। दुर्भाग्य से, यह समाधान बिल्कुल सीधे आगे नहीं है। लेकिन, यह ब्लोट, अन्य वर्गों और श्रोताओं के साथ दूर करता है। अगर मैं अधिक सीधे आगे के रास्ते का पता लगा सकता हूं, तो मैं इस फ़ंक्शन को फिर से लिखूंगा। या हो सकता है, यह किसी और के लिए एक एपिफनी होने के लिए अंतर्दृष्टि प्रदान करेगा।


1
तुमने मुझे बचाया! कुछ छिपा हुआ बग था। क्या गलत हो रहा था नहीं मिल सका। आप, सर, एक बज़िलियन अपवोट के लायक हैं!
नूरसुल्तान तालाबबकोव

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