Come cambiare la pagina di ViewPager?


150

Sto usando ViewPager nella mia app e lo definisco nell'attività principale. All'interno del onCreatemetodo carico un numero di pagine da SharedPreferences e quindi lo passo a PagerAdapter:

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

Il problema è che se cambiassi questo numero in Preferenze (o un'altra attività) in un altro indice di pagina inferiore a quello visualizzato in precedenza, la mia app si arresta in modo anomalo perché questo indice è fuori limite quando torno all'attività con questo ViewPager. Può essere risolto semplicemente cambiando la pagina di ViewPager attiva. C'è modo di farlo?

Risposte:


394

Non sono sicuro di aver compreso appieno la domanda, ma dal titolo della tua domanda, immagino che quello che stai cercando sia pager.setCurrentItem( num ). Ciò ti consente di passare programmaticamente a un'altra pagina all'interno di ViewPager.

Avrei bisogno di vedere una traccia dello stack da logcat per essere più specifici se questo non è il problema.


3
Sì, è esattamente quello di cui ho bisogno. Ho impostato a 0nel onPausemetodo e non v'è alcun crash. Grazie.
Roman

1
C'è davvero molto meno documentazione su ViewPager. +1 per quello.
Arnab Chakraborty,

1
se il tuo cercapersone impiega molto tempo per caricare la pagina di quanto puoi usare setOffscreenPageLimit (1), perché per impostazione predefinita il pager carica la pagina +1 e -1 dalla posizione corrente
Ajay Pandya

Questo non funziona Ho solo un errore che dice che il frammento è già stato aggiunto.
BlondeSwan,

24

scorrere verso destra

viewPager.arrowScroll (View.FOCUS_RIGHT);

scorrere verso sinistra

viewPager.arrowScroll (View.FOCUS_LEFT);


breve e pulito!
dakshbhatt21,

1
Credo quasi che questa dovrebbe essere la risposta accettata. È molto più pratico che impostare l'elemento corrente.
Peter,

18

Senza controllare il codice, penso che ciò che stai descrivendo sia che le tue pagine non sono sincronizzate e che hai dati obsoleti.

Dici che stai modificando il numero di pagine, quindi si blocca perché stai accedendo al vecchio set di pagine. Mi sembra che non stia chiamando pageAdapter.notifyDataSetChanged()dopo aver modificato i dati.

Quando viewPagerstai mostrando la pagina 3 di un set di 10 pagine e cambi in un set con solo 5, quindi chiama notifyDataSetChanged(), quello che troverai è che stai visualizzando la pagina 3 del nuovo set. Se in precedenza stavi visualizzando la pagina 8 del vecchio set, dopo aver inserito il nuovo set e aver chiamato notifyDataSetChanged(), scoprirai che ora stai visualizzando l'ultima pagina del nuovo set senza andare in crash.

Se cambi semplicemente la tua pagina corrente, potresti semplicemente mascherare il problema.


1
più 1 per notifyDataSetChanged ()
madhu527 il

@Richard Mi hai salvato amico mio giorno. 10000+ pernotifyDataSetChanged()
Ali

15

per passare a un'altra pagina, prova con questo codice:

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

1
Perfetto! Ho provato ad usarlo senza il metodo postDelay e non ha funzionato. Sai perché funziona con questo metodo? Grazie! :)
Georgi Koemdzhiev il

Stessa domanda ... perché l'oggetto cambia con questo ritardo e non altrimenti?
Kalyan Raghu,

@GeorgiKoemdzhiev Perché la vista non è ancora terminata quando stai chiamandoviewPager.setCurrentItem
Zohab Ali

3

Risposta supplementare

Inizialmente avevo problemi a ottenere un riferimento a ViewPager da altri metodi di classe perché addOnTabSelectedListenercreavano una classe interna anonima, che a sua volta richiedeva la ViewPagerdichiarazione della variabile final. La soluzione era usare una variabile membro della classe e non usare la classe interna anonima.

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.