Ottenere la posizione corrente di un ViewPager


84

So che con il widget Gallery sono stato in grado di utilizzare getSelectedItemPosition (); per recuperare la posizione corrente, tuttavia non sembra che ViewPager lo abbia.

So di poter impostare un listener e recuperare la posizione quando si cambia pagina. Ma voglio la posizione di visualizzazione corrente.

Risposte:


94

Crea un listener e impostalo sul tuo viewpager:

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}

4
Basta essere consapevoli quando si usa questo: getCurrentPage () restituirà sempre 0 quando la vista non è mai stata modificata. Per qualche motivo se entri nel ViewPager in una vista diversa dalla prima, il valore che ti aspetteresti non dovrebbe essere 0 ... Ho appena riscontrato un problema con questo dato che non sono sempre entrato nella vista dalla prima Visualizza.
Brandon Romano

1
@Adam puoi dirmi come chiamare questa funzione getCurrentPage
user3233280

È molto semplice. Grazie androidu.
whdals0


4

Aggiorna 2019

Ora puoi impostare addOnPageChangeListenerVisualizza cercapersone per osservare il cambiamento nella posizione della pagina.

Poiché volevi impostare un listener e recuperare la posizione quando la pagina viene cambiata

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })

-1

Ti sto dicendo che ora è un trucco, quindi non c'è motivo di downvote per questo motivo. Significa che ti sarà utile in modo specifico o no. In ogni caso, la descrizione di seguito fornirà alcune informazioni e sarà utile alla comunità. Inoltre, questa soluzione è utile per le API meno recenti che non hanno ViewPager.getCurrentItem().


Innanzitutto, una piccola informazione. Se iterate attraverso tutti i figli di un ViewPager ViewPager.getChildAt(x);e stampate con toString()(o getLeft()) ogni vista figlia (una pagina) e poi lo fate ogni volta che cambiate pagina, noterete che i figli non saranno nell'ordine logico in cui sono in quando inizi a tornare alle pagine (paging indietro all'inizio). Apparentemente, rimuoverà il figlio non necessario dall'array, quindi aggiungerà il figlio più recente all'array. Quindi, ad esempio, diciamo che stai guardando la pagina 2 e poi cambiato a pagina 3, il tuo elenco di bambini sarà in questo ordine non restituisce la pagina corrente. Non sono ancora riuscito a trovare una logica semplice per eliminare la pagina corrente utilizzando queste informazioni. Perché l'ordine delle pagine nella matrice dietropage 2, page 3, page 4 il che significa che ViewPager.getChildAt(1);restituirà la pagina corrente. Ma se poi torni a pagina 2 (da pagina 3) il tuo elenco di bambini sarà in questo ordine, il page 2, page 3, page 1che significa cheViewPager.getChildAt(1);getChildAt è in un ordine arbitrario basato sul modo in cui l'utente ha sfogliato.

Detto questo, ho sviluppato una soluzione per hackerare. Non ho idea se questa funzione funzionerà in tutti gli ambienti, ma funziona per il mio progetto attuale. Sospetto che se non lo fai per te, allora è un problema di diverso livello API. Ma in realtà non sospetto alcun problema per altri ambienti.

Ora passiamo alla carne. Quello che ho notato è che il risultato di ViewPager.getChildAt(x).getLeft()avrà un qualche tipo di coordinata pixel orizzontale rispetto al genitore. Quindi, ho usato queste informazioni per eliminare quale vista è quella corrente.

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

Questa funzione è probabilmente un hack discutibile perché si basa sul valore di getLeft() per capire tutto. Ma prendo la coordinata sinistra di ogni bambino. Quindi confronto questo con gli altri valori e memorizzo la prima e la seconda pagina, restituendo la seconda pagina (pagina corrente) fuori dalla funzione. Sembra funzionare magnificamente.

Perché (potresti chiedere) non ho semplicemente usato onClickListentero qualsiasi altra soluzione? Bene, ero dannatamente determinato che ci fosse un modo semplice per farlo senza dover includere ascoltatori, altre classi, concentrazione inconcludente e altro gonfio. Sfortunatamente, questa soluzione non è esattamente semplice. Ma elimina il gonfio, le altre classi e gli ascoltatori. Se riesco a trovare un modo più diretto, riscriverò questa funzione. O forse, questo fornirà informazioni a qualcun altro per avere un'illuminazione.


1
mi hai salvato! aveva qualche orribile bug. non riusciva a trovare cosa stava andando storto. Lei, signore, merita un miliardo di voti positivi!
Nursultan Talapbekov

Grazie signori! Immagino che la comunità non condivida il tuo entusiasmo.
Pimp Trizkit
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.