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.
Sie können verwenden:
quelle
Update 2019
Jetzt können Sie
addOnPageChangeListener
Pager 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
quelle
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 mittoString()
(odergetLeft()
) 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 4
was bedeutet, dassViewPager.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 Reihenfolgepage 2, page 3, page 1
angezeigt, 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 dahintergetChildAt
in 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.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
onClickListenter
andere 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.quelle