ViewPager'in sayfası nasıl değiştirilir?


150

Benim app ViewPager kullanıyorum ve ana Faaliyet tanımlayın. Inside onCreateyöntem SharedPreferences birkaç sayfa yüklemek ve daha sonra PagerAdapter geçirin:

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

Sorun, bu sayıyı Tercihler'de (veya başka bir Etkinlikte) daha önce görüntülediğim sayfa dizininden daha azına değiştirirsem, bu ViewPager ile etkinliğe döndüğümde bu dizin sınırların dışında olduğu için uygulamam çöküyor. Etkin ViewPager sayfası değiştirilerek kolayca düzeltilebilir. Bunu yapmanın bir yolu var mı?

Yanıtlar:


394

Soruyu tam olarak anladığımdan emin değilim, ancak sorunuzun başlığından, aradığınız şeyin olduğunu tahmin ediyorum pager.setCurrentItem( num ). Bu, programlı olarak içindeki başka bir sayfaya geçmenizi sağlar ViewPager.

Sorun bu değilse daha spesifik olmak için logcat bir yığın izleme görmek gerekir.


3
Evet, tam da ihtiyacım olan şey bu. Ben ayarlayın 0içinde onPauseyöntemle ve hiçbir çöker yoktur. Teşekkürler.
Roma

1
ViewPager hakkında gerçekten çok daha az dokümantasyon var. Bunun için +1.
Arnab Chakraborty

1
çağrı cihazınız sayfayı yüklemek için çok fazla zaman alıyorsa setOffscreenPageLimit (1) kullanabilirsiniz, çünkü varsayılan olarak çağrı cihazı geçerli konumdan +1 ve -1 sayfasını yükler
Ajay Pandya

Bu çalışmıyor Sadece parçanın zaten eklenmiş olduğunu söyleyen bir hata alıyorum.
BlondeSwan

24

sağa kaydır

viewPager.arrowScroll (View.FOCUS_RIGHT);

sola kaydır

viewPager.arrowScroll (View.FOCUS_LEFT);


kısa ve temiz!
dakshbhatt21

1
Bunun kabul edilen cevap olması gerektiğine neredeyse inanıyorum. Mevcut öğeyi ayarlamaktan çok daha pratiktir.
Peter

18

Kodunuzu kontrol etmeden, açıkladığınız şeyin sayfalarınızın senkronize olmadığını ve eski verileriniz olduğunu düşünüyorum.

Sayfa sayısını değiştirdiğinizi, ardından eski sayfa grubuna eriştiğiniz için çöktüğünüzü söylüyorsunuz. pageAdapter.notifyDataSetChanged()Verilerinizi değiştirdikten sonra aramıyormuşsunuz gibi geliyor bana .

viewPager10 sayfalık bir sayfanın 3. sayfasını gösterdiğinizde ve yalnızca 5 olan bir gruba geçtiğinizde arayın notifyDataSetChanged(), aradığınızda , yeni grubun 3. sayfasını görüntülediğinizi göreceksiniz. Daha önce eski setin 8. sayfasını görüntülüyorsanız, yeni seti koyduktan ve aradıktan sonra, yeni setin notifyDataSetChanged()son sayfasını çökmeden görüntülediğinizi göreceksiniz.

Geçerli sayfanızı değiştirirseniz, sorunu maskeliyor olabilirsiniz.


1
notifyDataSetChanged () için artı 1
madhu527

@Richard Günümü kurtarıyorsun dostum. 10000+ içinnotifyDataSetChanged()
Ali

15

başka bir sayfaya geçmek için şu kodu deneyin:

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

1
Mükemmel! PostDelay yöntemi olmadan kullanmaya çalıştım ve işe yaramadı. Neden bu yöntemle çalıştığını biliyor musunuz? Teşekkürler! :)
Georgi Koemdzhiev

Aynı soru ... neden bu gecikme ile öğe değişiyor, aksi halde değil?
Kalyan Raghu

@GeorgiKoemdzhiev Çünkü aradığınızda görüş henüz bitmediviewPager.setCurrentItem
Zohab Ali

3

Tamamlayıcı cevap

Aslında anonim bir iç sınıf yapılan, ViewPagerçünkü değişken bildirilmesini addOnTabSelectedListenergerekli çünkü diğer sınıf yöntemleri bir referans almakta sorun yaşıyordu . Çözüm bir sınıf üyesi değişkeni kullanmak ve anonim iç sınıfı kullanmak değildi.ViewPagerfinal

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);
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.