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
- No se puede cerrar NavigationDrawer con desplazamiento de derecha a izquierda
- Android Viewpager salta a la mitad de una página
- Igualar padre para viewpager dentro de scrollview no funciona
- El menú deslizante bloquea el evento táctil en la vista superior
- Cambiar el color de desplazamiento excesivo de ViewPager
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?
- ListView dentro de un fragmento utilizado en un ViewPager no se comporta como se esperaba
- Deshabilitar y habilitar la paginación en ViewPager en Android
- Filtrado ListView que forma parte de un fragmento de ViewPager
- ¿Por qué mi fragmento onCreate se llama extensivamente cada vez que una página a través de mis aplicaciones viewPager?
- RecyclerView + ViewPager NullPointerException en 'boolean android.support.v7.widget.RecyclerView $ LayoutManager.canScrollHorizontally ()'
- ViewPager no muestra nada
- Cómo implementar una aplicación de introducción con vista compartida animación
- Pestañas deslizantes dentro de las pestañas de la barra de acciones
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')