Android ViewPager problema de desplazamiento con sólo un elemento cuando se utiliza getPageWidth de PagerAdapter
Tengo un ViewPager con un PagerAdapter de encargo que sobrescribe el método getPageWidth para volver 0.3f, así que puedo mostrar varias páginas en la pantalla, según lo sugerido en el blog siguiente:
Http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html
- Iniciar animación cuando el fragmento es visible en ViewPager
- Usar vista o fragmento en ViewPager
- Los fragmentos de Viewpager de Android se actualizan al pasar
- Obtención del error "La actividad Java.lang.IllegalStateException se ha destruido" al utilizar pestañas con ViewPager
- WebViews en ViewPager no se cargan / representan hasta que se muestra la página
En este caso, ViewPager comienza vacío y el usuario comienza a llenar las páginas (imágenes) según lo solicitado. Las imágenes se llenan de izquierda a derecha. Todo funciona bien y las páginas se crean dinámicamente, y es fácil desplazarse entre ellas cuando hay varias imágenes.
Sin embargo, hay un problema cuando hay menos de tres páginas instanciadas. Un gesto de desplazamiento desde la derecha (sin contenido) a la izquierda produce un parpadeo con las páginas que se mueven de izquierda a derecha alternativamente, como si el ViewPager estuviera tratando de mover las primeras páginas a la derecha pero más tarde volviendo a su posición original. Esto sucede durante todo el gesto, y se detiene al dejar el gesto. Como he dicho esto no sucede cuando hay páginas suficientes para cubrir toda la anchura de la pantalla y un desplazamiento real es necesario.
¿Algunas ideas?
- Android ViewPager Cargando fragmentos incorrectos
- ViewPager con múltiples PageTransformer (PageTransformers en Runtime)
- Cómo reemplazar Fragment dentro de ViewPager, usando PagerAdapter?
- Fragmento de actualización de Android ViewPager
- IllegalStateException: No se puede cambiar la etiqueta del fragmento era android: switcher ahora android: switcher
- Cambiar dinámicamente el recuento de PagerIndicator en ViewPager o PagerAdapter
- Viewpager no envuelve contenido después de cargar imágenes desde Internet
- ViewPager con fragmentos anidados?
Sé que esta es una vieja pregunta, pero yo estaba buscando una solución y se encontró con este enlace (que rara vez hace referencia a esta pregunta). De todos modos, pude encontrar una solución basada en sus comentarios. La idea básica es permitir que los eventos de toque se basen en el estado de una bandera booleana que establezca.
-
Extienda ViewPager en la sustitución onInterceptTouchEvent & onTouchEvent para que sólo llame a super si ha definido el indicador. Mi clase se ve así:
public class MyViewPager extends ViewPager { private boolean isPagingEnabled = false; public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public MyViewPager(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (isPagingEnabled) { return super.onInterceptTouchEvent(event); } return false; } @Override public boolean onTouchEvent(MotionEvent event) { if (isPagingEnabled) { return super.onTouchEvent(event); } return false; } public void setPagingEnabled(boolean pagingEnabled) { isPagingEnabled = pagingEnabled; } }
-
En su xml de diseño, reemplace los elementos com.android.support.v4.ViewPager con elementos com.yourpackage.MyViewPager.
-
Puesto que devuelve 0.3f de getPageWidth () en tu adaptador de buscapersonas, deberías activar el desplazamiento cuando se agregue el cuarto ítem. La parte difícil es tener esta línea de código en todas partes cuando se define el adaptador de buscapersonas y se agregan o quitan todos los objetos de la lista de respaldo del adaptador.
mPager.setPagingEnabled(items.size() > 3);
Rahuls solución funciona, pero si desea habilitar automáticamente de paginación de acuerdo al contenido, puede modificar ViewPager de esta manera:
public class MyViewPager extends ViewPager { public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public MyViewPager(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (canScrollHorizontally(1)||canScrollHorizontally(-1)) { return super.onInterceptTouchEvent(event); } return false; } @Override public boolean onTouchEvent(MotionEvent event) { if (canScrollHorizontally(1)||canScrollHorizontally(-1)) { return super.onTouchEvent(event); } return false; }
}
Ahora, si el ViewPager es desplazable, permitirá toques, de lo contrario desactivar.
Yo era capaz de resolver de esta manera, en su método getPageWidth (), si sólo hay una imagen [se puede saber mediante la comprobación de tamaño de matriz o arraylist] devuelve 1, si el tamaño de entrada es mayor que 1 devuelve su decimal . Aquí está el código para lograr esto.
@override public float getPageWidth(int position){ if(inpputsize==1){ return 1.0; } return 0.9; }
- ActivityNotFoundException (YES, esta actividad se declara en AndroidManifest.xml)
- No se encontró ningún recurso que coincida con el nombre dado (en 'text' con el valor '@ string / continue_label')