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.
- ¿Cómo hacer un TableLayout desplazable?
- El Método ScrollTo no tiene uso
- No se puede cambiar el tamaño de los niños de diseño lineal en android reaccionar módulo nativo
- El desplazamiento de texto no funciona
- Android: ¿Animación de Scroller?
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
- Cómo desplazarse mediante programación WebView de Android
- Touchend no dispara después de touchmove
- Android, LinearLayout no se desplaza
- Obtener el elemento visible en el centro de RecycleView al desplazarse
- Desplazamiento suave en Android
- ¿Hay alguna manera de saber cuántos elementos están mostrando en una vista de lista?
- Android WebView dentro de ScrollView solo desplaza scrollview
- ListView - ImageLoader mueve Lista / Elementos en Scroll up
¿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);
- Obtener ruta de acceso y nombre de archivo de la imagen de galería seleccionada en Android
- Eclipse Content Assist no funciona con Android