Obtener la posición actual de un ViewPager

84

Sé que con el widget de Galería pude usar getSelectedItemPosition (); para recuperar la posición actual, sin embargo, no parece que ViewPager tenga eso.

Sé que puedo configurar un oyente y recuperar la posición cuando se cambia la página. Pero quiero la posición de vista actual.

Adán
fuente

Respuestas:

94

Cree un oyente y configúrelo en su visor:

/**
 * 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;
    }
}
androidu
fuente
4
Solo tenga en cuenta al usar esto: getCurrentPage () siempre devolverá 0 cuando la vista nunca se haya cambiado. Por alguna razón, si ingresa al ViewPager en alguna vista que no sea la primera vista, el valor que esperaría no debería ser 0 ... Acabo de tener un problema con esto ya que no siempre ingresé a la vista en la primera ver.
Brandon Romano
1
@Adam, ¿puedes decirme cómo llamar a esta función? GetCurrentPage
user3233280
Es muy simple. Gracias androidu.
whdals0
193

Puedes usar:

mViewPager.getCurrentItem()
Terry
fuente
No hay método getCurrentItem en ViewPager
Dmitry Guselnikov
3
Lo siento estaba equivocado. Acabo de actualizar mi biblioteca de soporte y este método existe en una nueva versión
Dmitry Guselnikov
4

Actualización 2019

Ahora puede configurar addOnPageChangeListenerVer buscapersonas para observar el cambio en la posición de la página.

Como deseaba configurar un oyente y recuperar la posición cuando se cambia de página

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)
            }
        })
Hitesh Sahu
fuente
-1

Te digo que ahora es un truco, por lo que no hay razón para rechazar por ese motivo. Es decir, le será útil específicamente o no. De cualquier manera, la descripción a continuación proporcionará información y será útil para la comunidad. Además, esta solución es buena para las API más antiguas que no tienen ViewPager.getCurrentItem().


Primero, un poco de información. Si itera a través de todos los elementos secundarios de un ViewPager con ViewPager.getChildAt(x);e imprime con toString()(o getLeft()) cada Vista secundaria (una página) y luego hace esto cada vez que cambia de página, notará que los elementos secundarios no estarán en el orden lógico en el que se muestran. cuando empiece a retroceder páginas (regresando al principio). Aparentemente, eliminará el hijo innecesario de la matriz y luego agregará el hijo más nuevo a la matriz. Entonces, por ejemplo, digamos que está viendo la página 2 y luego cambiado a la página 3, su lista de niños estará en este orden, page 2, page 3, page 4lo que significa que ViewPager.getChildAt(1);devolverá la página actual. Pero, si luego vuelve a la página 2 (desde la página 3), su lista de niños estará en este orden, lo page 2, page 3, page 1que significa queViewPager.getChildAt(1);no devuelve la página actual. Todavía no he podido encontrar una lógica simple para eliminar la página actual usando esta información. Porque el orden de las páginas en la matriz de detrás getChildAtestá en un orden arbitrario basado en cómo el usuario ha estado navegando.

Dicho esto, desarrollé una solución alternativa para hackear. No tengo ni idea de si esta función funcionará en todos los entornos, pero funciona para mi proyecto actual. Sospecho que si no es para usted, entonces es un problema de nivel de API diferente. Pero en realidad no sospecho ningún problema para otros entornos.

Ahora, sobre la carne. Lo que noté fue que el resultado de ViewPager.getChildAt(x).getLeft()tendrá algún tipo de coordenada de píxel horizontal en relación con el padre. Entonces, usé esta información para descartar qué vista es la actual.

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

Esta función es probablemente un truco cuestionable porque se basa en el valor de getLeft()para resolverlo todo. Pero, tomo la coordenada izquierda de cada niño. Luego comparo esto con los otros valores y almaceno la primera y segunda página, devolviendo la segunda página (página actual) fuera de la función. Parece funcionar maravillosamente.

¿Por qué (podrías preguntar) no usé simplemente onClickListentero cualquier solución? Bueno, estaba condenado a la determinación de que había una manera sencilla de hacer esto sin tener que incluir a los oyentes, otras clases, un enfoque inconcluso y otros problemas. Desafortunadamente, esta solución no es exactamente sencilla. Pero, elimina la hinchazón, otras clases y oyentes. Si puedo encontrar una forma más sencilla, reescribiré esta función. O tal vez, esto proporcionará información para que otra persona tenga una epifanía.

Proxeneta Trizkit
fuente
1
¡me salvaste! tenía un error horrible. No pude encontrar lo que iba mal. ¡Usted, señor, se merece un billón de votos a favor!
Nursultan Talapbekov
¡Gracias señores! Supongo que la comunidad no comparte tu entusiasmo.
Pimp Trizkit