ViewPager का पेज कैसे बदलें?


150

मैं अपने ऐप में ViewPager का उपयोग कर रहा हूं और इसे मुख्य गतिविधि में परिभाषित करता हूं। अंदर की onCreateविधि मैंने कुछ पेजों को शेयर्डप्रिफरेंस से लोड किया और फिर उसे पेजर एडेप्टर में भेज दिया:

@Override
public int getCount() {
    return numberOfPages;
}

समस्या यह है कि अगर मैं इस संख्या को वरीयताएँ (या किसी अन्य गतिविधि) में किसी अन्य कम में बदलूंगा, तो पृष्ठ सूचकांक मैं पहले देखा था, मेरा ऐप क्रैश हो गया क्योंकि जब मैं इस ViewPager के साथ गतिविधि पर लौटता हूं तो यह सूचकांक सीमा से बाहर हो जाता है। इसे केवल सक्रिय ViewPager के पृष्ठ को बदलकर ठीक किया जा सकता है। इसे करने का कोई तरीका है?

जवाबों:


394

मुझे यकीन नहीं है कि मैं इस प्रश्न को पूरी तरह से समझता हूं, लेकिन आपके प्रश्न के शीर्षक से, मैं अनुमान लगा रहा हूं कि आप क्या देख रहे हैं pager.setCurrentItem( num )। यह आपको प्रोग्राम को दूसरे पेज पर स्विच करने की अनुमति देता है ViewPager

अगर यह समस्या नहीं है तो मुझे लॉगकैट से एक स्टैक ट्रेस देखने की आवश्यकता होगी जो अधिक विशिष्ट हो।


3
हां, बस यही मेरी जरूरत है। मैंने इसे विधि 0में सेट किया है onPauseऔर कोई क्रैश नहीं है। धन्यवाद।
रोमन

1
ViewPager पर वास्तव में बहुत कम प्रलेखन है। उसके लिए +1।
अर्नब चक्रवर्ती

1
यदि आपका पेजर लोड होने में पेज के लिए बहुत समय लेता है तो आप सेटऑफस्क्रीनपेजिमिट (1) का उपयोग कर सकते हैं, क्योंकि डिफ़ॉल्ट दृश्य पेजर लोड +1 और -1 पेज वर्तमान स्थिति से
अजय पंड्या

यह काम नहीं करता है मुझे सिर्फ यह कहते हुए एक त्रुटि मिलती है कि टुकड़ा पहले ही जोड़ा जा चुका है।
गोरास्वान

24

दाईं ओर स्लाइड करें

viewPager.arrowScroll (View.FOCUS_RIGHT);

बाईं ओर स्लाइड करें

viewPager.arrowScroll (View.FOCUS_LEFT);


छोटा और साफ!
dakshbhatt21 14

1
मैं लगभग मानता हूं कि यह स्वीकृत उत्तर होना चाहिए। यह वर्तमान आइटम को सेट करने की तुलना में बहुत अधिक व्यावहारिक है।
पीटर

18

आपके कोड की जांच किए बिना, मुझे लगता है कि आप जो वर्णन कर रहे हैं वह यह है कि आपके पृष्ठ सिंक से बाहर हैं और आपके पास बासी डेटा है।

आप कहते हैं कि आप पृष्ठों की संख्या बदल रहे हैं, फिर दुर्घटनाग्रस्त हो रहे हैं क्योंकि आप पृष्ठों के पुराने सेट तक पहुंच रहे हैं। यह मुझे लगता है जैसे आप pageAdapter.notifyDataSetChanged()अपना डेटा बदलने के बाद कॉल नहीं कर रहे हैं ।

जब आपका viewPager10 पेज के सेट का पेज 3 दिखाई दे रहा है, और आप केवल 5 के सेट पर बदलते हैं, तो कॉल करें notifyDataSetChanged(), जो आपको मिलेगा वह आप नए सेट के पेज 3 को देख रहे हैं। यदि आप पहले पुराने सेट के पेज 8 को देख रहे थे, तो नए सेट में डालने और कॉल करने के बाद notifyDataSetChanged()आप पाएंगे कि अब आप नए सेट के आखिरी पेज को बिना क्रैश हुए देख रहे हैं।

यदि आप बस अपने वर्तमान पृष्ठ को बदलते हैं, तो आप सिर्फ समस्या का सामना कर सकते हैं।



@ रिचर्ड आप मेरा दिन बचाते हैं दोस्त। 10000+ के लिएnotifyDataSetChanged()
अली

15

किसी अन्य पृष्ठ पर जाने के लिए, इस कोड के साथ प्रयास करें:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);

1
उत्तम! मैंने पोस्टडेल विधि के बिना इसका उपयोग करने की कोशिश की और यह काम नहीं किया। क्या आप जानते हैं कि यह इस विधि के साथ क्यों काम करता है? धन्यवाद! :)
जॉर्जी कोमेधिवेव

एक ही सवाल ... इस देरी के साथ आइटम क्यों बदल रहा है और अन्यथा नहीं?
कल्याण रघु २५'१

@GeorgiKoemdzhiev क्योंकि आप कॉल कर रहे हैं तब भी दृश्य अभी तक समाप्त नहीं हुआ हैviewPager.setCurrentItem
ज़ोहैब अली

3

पूरक जवाब

मुझे मूल रूप ViewPagerसे अन्य वर्ग विधियों से संदर्भ प्राप्त करने में समस्या हो रही थी क्योंकि addOnTabSelectedListenerएक अनाम आंतरिक वर्ग बनाया गया था, जिसके बदले ViewPagerचर को घोषित करने की आवश्यकता थी final। समाधान एक वर्ग सदस्य चर का उपयोग करना था और अनाम आंतरिक वर्ग का उपयोग नहीं करना था।

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        // don't use an anonymous inner class here
        tabLayout.addOnTabSelectedListener(tabListener);

    }

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    };

    // The view pager can now be accessed here, too.
    public void someMethod() {
        viewPager.setCurrentItem(0);
    }

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