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.
Puedes usar:
mViewPager.getCurrentItem()
fuente
Actualización 2019
Ahora puede configurar
addOnPageChangeListener
Ver 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) } })
fuente
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 contoString()
(ogetLeft()
) 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 4
lo que significa queViewPager.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, lopage 2, page 3, page 1
que 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ásgetChildAt
está 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
onClickListenter
o 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.fuente