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

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?

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.

  1. 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; } } 
  2. En su xml de diseño, reemplace los elementos com.android.support.v4.ViewPager con elementos com.yourpackage.MyViewPager.

  3. 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; } 
  • Viewpager + webview, cómo detener la carga de la webview
  • Usando un FragmentTabHost con un ViewPager
  • Índice de fragmentos de resultados de actividad Fuera del rango: 0x20001
  • ¿Por qué getCount se llama tantas veces en PagerAdapter?
  • Uso de SlidingPaneLayout de Android con ViewPager
  • La recreación de fragmentos de ViewPager se reanuda pero no se ve
  • ViewPager dentro de Fragmento pierde contenido al volver a él
  • Onclick en paginador de vista en android no funciona en mi código
  • ViewPager en blanco en la parte posterior de otro fragmento
  • Android usando viewPager vs usando tabhost
  • Obtención del error "La actividad Java.lang.IllegalStateException se ha destruido" al utilizar pestañas con ViewPager
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.