web-dev-qa-db-fra.com

Comment changer la page ViewPager?

J'utilise ViewPager dans mon application et le définis dans l'activité principale. Dans la méthode onCreate, je charge un certain nombre de pages à partir de SharedPreferences, puis je le passe à PagerAdapter:

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

Le problème est que si je modifiais ce nombre dans les Préférences (ou une autre activité) par un index inférieur à celui que j'avais précédemment visualisé, mon application se bloquait, car cet index était hors limite lorsque je revenais à l'activité avec ce ViewPager. Il peut être corrigé simplement en modifiant la page active de ViewPager. Y a-t-il un moyen de le faire?

145
Roman

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 recherchez, c'est pager.setCurrentItem( num ). Cela vous permet de passer par programmation à une autre page dans la ViewPager.

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

387
Mark Allison

glisser à droite

viewPager.arrowScroll (View.FOCUS_RIGHT);)

glisser à gauche

viewPager.arrowScroll (View.FOCUS_LEFT);)

17
Abror Esonaliyev

Sans vérifier votre code, je pense que ce que vous décrivez, c'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 vous vous bloquez, car vous accédez à l'ancien ensemble de pages. Cela 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 avec seulement 5, puis appelez notifyDataSetChanged(), vous constaterez que la page 3 de la nouvel ensemble. Si vous visualisiez précédemment la page 8 de l'ancien ensemble, après avoir inséré le nouvel ensemble et appelé notifyDataSetChanged(), vous constaterez que vous visualisez maintenant la dernière page du nouvel ensemble sans se planter.

Si vous changez simplement votre page actuelle, vous masquerez peut-être simplement le problème.

17
RichardP

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

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

Réponse supplémentaire

J'avais à l'origine des difficultés à obtenir une référence à ViewPager à partir d'autres méthodes de classe, car addOnTabSelectedListener créait une classe interne anonyme, qui nécessitait à son tour la déclaration de la variable ViewPager - final. La solution consistait à utiliser une variable de membre de classe et non à 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);
    }

}
3
Suragch