147 votes

Comment changer la page du ViewPager ?

J'utilise ViewPager dans mon application et je le définis dans l'activité principale. A l'intérieur de onCreate Je charge un certain nombre de pages à partir de SharedPreferences et je les passe ensuite à PagerAdapter :

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

Le problème est que si je change ce nombre dans les préférences (ou dans une autre activité) pour un autre indice inférieur à celui de la page que j'ai consultée auparavant, mon application se plante parce que cet indice est hors limites lorsque je reviens à l'activité avec ce ViewPager. Ce problème peut être résolu simplement en changeant la page du ViewPager actif. Existe-t-il un moyen de le faire ?

390voto

Mark Allison Points 10123

Je ne suis pas sûr de bien comprendre la question, mais d'après le titre de votre question, je suppose que ce que vous cherchez est pager.setCurrentItem( num ) . Cela vous permet de passer de manière programmée à une autre page dans le cadre de l'application ViewPager .

J'aurais besoin de voir une trace de pile de logcat pour être plus précis si ce n'est pas le problème.

26voto

Abror Esonaliyev Points 987

Glisser vers la droite

viewPager.arrowScroll(View.FOCUS_RIGHT) ;

glisser vers la gauche

viewPager.arrowScroll(View.FOCUS_LEFT) ;

18voto

David Figueroa Points 357

Pour passer à une autre page, essayez avec ce code :

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

17voto

RichardP Points 53

Sans vérifier votre code, je pense que ce que vous décrivez est que vos pages ne sont pas synchronisées et que vous avez des données périmées.

Vous dites que vous modifiez le nombre de pages, puis que le système se bloque parce que vous accédez à l'ancien ensemble de pages. Il me semble que vous n'appelez pas pageAdapter.notifyDataSetChanged() après avoir modifié vos données.

Lorsque votre viewPager affiche la page 3 d'un ensemble de 10 pages, et que vous passez à un ensemble de seulement 5 pages, alors appelez notifyDataSetChanged() vous verrez que vous êtes maintenant à la page 3 du nouveau jeu. Si vous visualisiez auparavant la page 8 de l'ancien jeu, après avoir mis le nouveau jeu et appelé notifyDataSetChanged() vous verrez que vous visualisez maintenant la dernière page du nouveau jeu sans planter.

Si vous modifiez simplement votre page actuelle, vous risquez de masquer le problème.

3voto

Suragch Points 197

Réponse complémentaire

A l'origine, j'avais du mal à obtenir une référence à la ViewPager d'autres méthodes de classe parce que le addOnTabSelectedListener a créé une classe interne anonyme qui, à son tour, a nécessité l'utilisation de l'option ViewPager variable à déclarer final . La solution était d'utiliser une variable membre de la classe et de ne pas utiliser la classe interne anonyme.

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

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X