Abrufen der aktuellen Position eines ViewPagers


84

Ich weiß, dass ich mit dem Galerie-Widget getSelectedItemPosition () verwenden konnte. Um die aktuelle Position abzurufen, scheint ViewPager diese jedoch nicht zu haben.

Ich weiß, dass ich einen Listener einrichten und die Position abrufen kann, wenn die Seite gewechselt wird. Aber ich möchte die aktuelle Ansichtsposition.

Antworten:


94

Erstellen Sie einen Listener und legen Sie ihn auf Ihrem Viewpager fest:

/**
 * 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
Beachten Sie dabei Folgendes: getCurrentPage () gibt immer 0 zurück, wenn die Ansicht nie geändert wurde. Aus irgendeinem Grund sollte der erwartete Wert nicht 0 sein, wenn Sie den ViewPager in einer anderen Ansicht als der ersten Ansicht eingeben. Ich bin gerade auf ein Problem gestoßen, da ich die Ansicht nicht immer in der ersten Ansicht eingegeben habe Aussicht.
Brandon Romano

1
@ Adam können Sie mir bitte sagen, wie man diese Funktion aufruft getCurrentPage
user3233280

Es ist sehr einfach. Danke androidu.
whdals0


4

Update 2019

Jetzt können Sie addOnPageChangeListenerPager anzeigen so einstellen , dass Änderungen an der Seitenposition beobachtet werden.

Da wollten Sie einen Listener einrichten und die Position abrufen, wenn die Seite gewechselt wird

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

Ich sage Ihnen jetzt, es ist ein Hack, also gibt es keinen Grund, aus diesem Grund abzustimmen. Das heißt, es wird entweder speziell für Sie hilfreich sein oder nicht. In beiden Fällen bietet die folgende Beschreibung einen Einblick und ist für die Community hilfreich. Diese Lösung eignet sich auch für ältere APIs, die keine haben ViewPager.getCurrentItem().


Zunächst ein paar Informationen. Wenn Sie alle untergeordneten Elemente eines ViewPagers mit jeder untergeordneten Ansicht (einer Seite) durchlaufen ViewPager.getChildAt(x);und mit toString()(oder getLeft()) jeder untergeordneten Ansicht (einer Seite) ausdrucken und dies dann bei jedem Seitenwechsel tun, werden Sie feststellen, dass die untergeordneten Elemente nicht in der logischen Reihenfolge angezeigt werden, in der sie angezeigt werden in, wenn Sie anfangen, Seiten zurück zu blättern (Paging zurück zum Anfang). Anscheinend wird das nicht benötigte Kind aus dem Array entfernt und dann das neueste Kind an das Array angehängt. Nehmen wir zum Beispiel an, Sie sehen sich Seite 2 an und wechseln dann zu Seite 3. Ihre Liste der Kinder befindet sich in dieser Reihenfolge, page 2, page 3, page 4was bedeutet, dass ViewPager.getChildAt(1);die aktuelle Seite zurückgegeben wird. Wenn Sie dann jedoch zu Seite 2 (von Seite 3) zurückkehren, wird Ihre Liste der Kinder in dieser Reihenfolge page 2, page 3, page 1angezeigt, was bedeutet, dassViewPager.getChildAt(1);gibt die aktuelle Seite nicht zurück. Ich konnte noch keine einfache Logik finden, um die aktuelle Seite anhand dieser Informationen auszusortieren. Weil die Reihenfolge der Seiten im Array dahinter getChildAtin einer beliebigen Reihenfolge liegt, die davon abhängt, wie der Benutzer herumgespielt hat.

Davon abgesehen habe ich einen Hack-Workaround entwickelt. Ich habe keine Ahnung, ob diese Funktion in allen Umgebungen funktioniert, aber sie funktioniert für mein aktuelles Projekt. Ich würde vermuten, wenn nicht für Sie, dann ist es ein Problem der verschiedenen API-Ebene. Aber ich vermute eigentlich keine Probleme für andere Umgebungen.

Nun zum Fleisch. Was mir aufgefallen ist, dass das Ergebnis von ViewPager.getChildAt(x).getLeft()eine Art horizontale Pixelkoordinate relativ zum übergeordneten Element hat. Also habe ich diese Informationen verwendet, um herauszufinden, welche Ansicht die aktuelle ist.

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

Diese Funktion ist wahrscheinlich ein fragwürdiger Hack, da sie sich auf den Wert von stützt getLeft(), um alles herauszufinden. Aber ich greife nach der linken Koordinate jedes Kindes. Ich vergleiche dies dann mit den anderen Werten und speichere die erste und zweite Seite, wobei die zweite Seite (aktuelle Seite) aus der Funktion zurückgegeben wird. Es scheint wunderbar zu funktionieren.

Warum (könnten Sie fragen) habe ich nicht einfach eine onClickListenterandere Lösung verwendet? Nun, ich war verdammt entschlossen, dass es einen direkten Weg gab, dies zu tun, ohne Zuhörer, andere Klassen, nicht schlüssigen Fokus und andere Aufblähungen einbeziehen zu müssen. Leider ist diese Lösung nicht gerade einfach. Aber es beseitigt das Aufblähen, andere Klassen und Zuhörer. Wenn ich einen einfacheren Weg finden kann, werde ich diese Funktion neu schreiben. Oder vielleicht bietet dies jemand anderem die Möglichkeit, eine Offenbarung zu haben.


1
Du hast mich gerettet! hatte einen schrecklichen Fehler. konnte nicht finden, was falsch lief. Sie, Sir, verdienen eine Unmenge von Stimmen!
Nursultan Talapbekov

Vielen Dank, meine Herren! Ich denke, die Community teilt Ihre Begeisterung nicht.
Pimp Trizkit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.