SetCurrentItem en ViewPager no se desplaza inmediatamente en la posición correcta

Yo uso un PagerAdapter. Tengo muchos elementos para no cargar todos los elementos al mismo tiempo. Vuelvo a cargar el adaptador, cambio los viejos elementos por los nuevos elementos. Por ejemplo tengo 4 elementos, cuando llego al último elemento, vuelvo a cargar los elementos y llamo a setCurentItem (1) para poder mostrar el viewpager en la posición uno. He hecho muchas pruebas. Pongo:

viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page. viewPager.setCurrentItem(1); 

He intentado modificar onPageScrollStateChanged (int arg0), sólo tengo 3 puntos de vista y siempre ubicate en el medio.

 if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) { if(focusedPage==2) { //Modify adapter viewPager.setCurrentItem(1,false); }else if(focusedPage==0){ //Modify adapter viewPager.setCurrentItem(1,false); } 

Y he intentado modificar onPageSelected (int arg0)

 focusedPage=arg0; 

Utilizando este último ejemplo he desplazado las vistas de inmediato pero siempre se encuentra en la última página. Cualquiera sabe cómo puedo deslizar.

Gracias

¿Puedo saber más sobre los antecedentes de lo que estás tratando de lograr?

De todos modos, por lo que puedo entender que está tratando de hacer un ViewPager "infinito" va desde el último al primero y viceversa (por favor, corrija si estoy equivocado). Y usted quiere que su ViewPager vaya a la primera página, pero el desplazamiento – no sólo aparecen de la nada.

Bueno, si desactiva el desplazamiento suave (el segundo parámetro), entonces se irá directamente a la página que desea sin movimiento de desplazamiento (y no "cambiará" a las otras páginas en el camino), y si habilita el desplazamiento suave Desplácese y luego pasará por todas las vistas, así que verá cómo no fue la siguiente sino la primera.

  /*No swipe animation, and no onPageChanged for the page in the middle*/ mPager.setCurrentItem(1, false); /*The same as if you do not add the second parameter*/ mPager.setCurrentItem(1, true); /*Your ViewPager scrolls through all the needed views until it arrives at that view.*/ mPager.setCurrentItem(1); 

Lo que puedo recomendarle con esto en mente es que puede intentar agregar una vista "ficticia" en las posiciones 0 y "última" y la vista en la posición 0 sería la misma que la posición "último – 1" y la "última" Vista sería la misma que la posición "1". Así que usted hará todo lo normal, EXCEPTO que en el OnPageChangeListener usted verificará si la página actual es la posición "0" o "pasado" y si es así, llamará setCurrentItem ("1", false) o setCurrentItem ("last – 1 ", falso) en función de la posición en la que se encuentre ahora. De esta manera mantendrá el efecto "cambio de página" mientras realiza lo que desea.

Espero que esto pueda ayudarle con su problema.

NOTA: Puede tener un cambio laggy después de llegar a la nueva posición, ya que tendrá que cargar la vista para las vistas actual, siguiente y último (o si está en 4.0 +, entonces se cargará sólo la posición real).

ACTUALIZAR:

Si cambia el contenido de la lista / matriz que determina el contenido del ViewPager , debe llamar a:

 ViewPager mPager = new ViewPager(); mPager.getAdapter().notifyDataSetChanged(); //This notify that you need to recreate the views /*This is if you want to change the data and then go to a specific position If you do not do this you will have a very Buggy Behavior*/ new Handler().post(new Runnable() { @Override public void run() { mPager.setCurrentItem(2); //Where "2" is the position you want to go } }); 

ACTUALIZACIÓN 2:

¿Por qué no agrega todos sus elementos al ViewPager ? El ViewPager ya tiene optimización para manejar esos casos, en mi caso tengo muchos elementos en él y funciona como un encanto.

Otra cosa, en tu código, veo que cambias a la página central cada vez que una página se "instala". Pero entonces realmente nunca mostrar la vista de la derecha y la izquierda, así que ¿por qué los tienes?

Por último, cuando cambias tu conjunto de datos, debes llamar al método "notifyDataSetChanged" que mencioné anteriormente y llamar al método "setCurrentItem" dentro de un manejador. Si no lo hace, su aplicación no funcionará como se esperaba.

ACTUALIZACIÓN 3:

Bueno, lo único que puedo recomendar es tener una lista en la que siga agregando los nuevos objetos que traiga de la base de datos y, a continuación, siempre y cuando siga insertando objetos al final de la lista no hay ningún problema. Si desea agregar objetos en el centro o al principio, entonces necesita llamar a notifyDataSetChanged, pero eso va a ser un poco lento porque generará las vistas de nuevo. Lo hacemos de esta manera y funciona perfectamente e incluso descargamos la información de un servidor, los datos no son locales (y en realidad añadimos información al final e inicio de la lista).

Si tiene alguna otra pregunta acerca de cómo lograrlo, no dude en preguntar.

ACTUALIZACIÓN 4:

En caso de que alguien esté buscando un ViewPager circular, agregué un código de prueba de concepto que puede reutilizar. Funciona sin problemas y lo he usado con vistas complejas y todavía no hay retraso alguno.

No funciona sin un postDelayed, intente con este código:

 viewPager.postDelayed(new Runnable() { @Override public void run() { viewPager.setCurrentItem(num, true); } }, 100); 
  • Android: ¿Cómo obtener el actual desplazamiento X de RecyclerView?
  • Emulador Android no Desplácese hacia abajo
  • Horizontal RecyclerView dentro de ListView sin desplazamiento muy suave
  • ScrollView no se desplaza en absoluto
  • Desplazamiento de imagen enriquecido y zoom en android
  • Fuerza de la pantalla WebView para dibujar
  • Crear un RecyclerView con desplazamiento horizontal y vertical
  • Desplazamiento de la animación en NavigationView
  • Detener el desplazamiento en una vista de lista
  • Ninepatch escala incorrecta al desplazarse después de aplicar un filtro de color?
  • ¿Efecto de desplazamiento personalizado para scrollview?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.