¿Cómo se obtiene el número de página actual de un ViewPager para Android?

84

Quiero saber la posición actual de la página ViewPager. Creo un adaptador y configuro este adaptador en ViewPager. Ahora quiero saber el número de página actual o la posición de la vista actual, porque quiero iniciar algunos eventos adicionales en esa página en particular.

Utilicé viewPager.setCurrentItem(1);para configurar el primer elemento.

¿Existe un método similar para obtener la página actual?

sam_k
fuente

Respuestas:

180

en los paquetes más recientes también puede usar

vp.getCurrentItem()

o

vp es el viewPager,

pageListener = new PageListener();
vp.setOnPageChangeListener(pageListener);

tienes que poner un oyente de cambio de página para tu viewPager. No hay ningún método en viewPager para obtener la página actual.

private int currentPage;

    private static class PageListener extends SimpleOnPageChangeListener{
            public void onPageSelected(int position) {
                Log.i(TAG, "page selected " + position);
                   currentPage = position;
        }
    }
Yashwanth Kumar
fuente
Muchas gracias hombre ... funciona ... ¿Has trabajado antes en ViewPager?
sam_k
@Necronet no, no debería. La clase PageListener debe ser una clase interna, no una clase anidada.
dcow
Obtuve una excepción de puntero nulo a veces al comienzo de las imágenes del buscapersonas, para soluciones más confiables, sugiero esto, funciona bien para mí. stackoverflow.com/a/13831450/2296787
MBH
setOnPageChangeListener()está en desuso, utilícelo addOnPageChangeListener()en su lugar.
ZzZombo
47

Hay un método object_of_ViewPager.getCurrentItem()que devuelve la posición de la página actualmente vista del buscapersonas

Krishna Shrestha
fuente
De hecho, publiqué esta respuesta primero @ChuckBoris, aún así, esta parece haber obtenido más votos y aparentemente un respaldo. Extrañas son las formas de este sitio :)
devanshu_kaushik
17

Si solo desea la posición, vp.getCurrentItem()se la dará, no es necesario que aplique onPageChangeListener () solo para ese propósito.

devanshu_kaushik
fuente
8

Descubrirá que setOnPageChangeListener está en desuso, use addOnPageChangeListener, como se muestra a continuación:

ViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
       if(position == 1){  // if you want the second page, for example
           //Your code here
       }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});
Geraldo Neto
fuente
7

Para este problema, el oyente de Onpagechange es el mejor. Pero también tendrá un pequeño error: no detectará el tiempo de inicio de la posición 0. Una vez que cambie la página, comenzará a detectar la posición de la página seleccionada ... Para esto problema, busco la solución más fácil

1. Tiene que mantener el valor de posición seleccionado y luego usarlo ....
2. Caso 1: Al comienzo de la posición siempre es cero ....
Caso 2: Suponga que si establece el elemento actual significa que establecerá valor para mantener la posición
3, luego haga su acción con el uso de ese mantener en su actividad ...

Public int maintain=0;
myViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {
             //Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPageSelected( int i) {
          // here you will get the position of selected page
            maintain = i;


        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });


updateButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
            data.set(maintain, "Replaced "+maintain);         
            myViewPager.getAdapter().notifyDataSetChanged();
        }
    });
Naveen Kumar
fuente
1
setOnPageChangeListener está en desuso. Utilice addOnPageChangeListener en lugar de setOnPageChangeListener.
Selin
6

getCurrentItem(), en realidad no da la posición correcta para la primera y la última página. Lo arreglé agregando este código:

public void CalcPostion() {    
    current = viewPager.getCurrentItem();

    if ((last == current) && (current != 1) && (current != 0)) {
        current = current + 1;
        viewPager.setCurrentItem(current);
    }
    if ((last == 1) && (current == 1)) {
        last = 0;
        current = 0;
    }
    display();
    last = current;
}
Da-monk
fuente
5

No hay ningún método getCurrentItem () en viewpager.i ya verifiqué la API

raman
fuente
3
Tienes que actualizar el paquete de compatibilidad en Android SDK Manager, luego solo obtienes ese método.
krisDrOid
5

El método setOnPageChangeListener () está obsoleto. Utilice addOnPageChangeListener (OnPageChangeListener) en su lugar.

Puede usar OnPageChangeListener y obtener la posición dentro del onPageSelected()método, este es un ejemplo:

   viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            Log.d(TAG, "my position is : " + position); 
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

O simplemente use getCurrentItem () para obtener la posición real:

viewPager.getCurrentItem();
Jorgesys
fuente