ListView inside SwipeRefreshLayout inside Gaveta (Layout): no bloquea la dirección de desplazamiento

Un ListView bloquea su dirección de desplazamiento en la dirección de desplazamiento iniciado. Esto funciona muy bien con esta configuración:

DrawerLayout ListView 

Cuando deslizo hacia arriba o hacia abajo, la lista se desplaza. Cuando me desplazo a la izquierda, el cajón se cierra: perfecto. Cuando empiezo a deslizar hacia abajo y luego cambiar de dirección, la dirección inicial (horizontal / vertical) está bloqueada.

Sin embargo, si envuelvo la lista en un SwipeRefreshLayout como esto:

 DrawerLayout SwipeRefreshLayout ListView 

.. entonces el bloqueo de la dirección de desplazamiento / desplazamiento no funciona más. Cuando deslizo hacia arriba / abajo y luego un poco a la izquierda / derecha, la lista se desplaza y el cajón también se mueve. Este último no es lo que quiero.

¿Alguna sugerencia sobre cómo recuperar el comportamiento anterior con SwipeRefreshLayout?

Tuve el mismo problema pero con un RecyclerView en lugar de un ListView. La solución más fácil es extender SwipeRefreshLayout y cuando se detecta un movimiento de desplazamiento hacia abajo, indique al diseño principal (de cajón) que no intercepte eventos (por ejemplo, deslizar el cajón).

 import android.content.Context; import android.support.v4.widget.SwipeRefreshLayout; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewConfiguration; public class DrawerSwipeRefreshLayout extends SwipeRefreshLayout { private int touchSlop; private float initialDownY; public DrawerSwipeRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialDownY = event.getY(); break; case MotionEvent.ACTION_MOVE: final float eventY = event.getY(); float yDiff = Math.abs(eventY - initialDownY); if (yDiff > touchSlop) { getParent().requestDisallowInterceptTouchEvent(true); } } return super.onInterceptTouchEvent(event); } } 

Lo que puedes probar es, con la ayuda de Gesture Detector, encontrar si el golpe es horizontal o vertical. Si su vertical le da el evento táctil a la vista de lista, de lo contrario a DrawerLayout.

Yo uso la versión de la biblioteca de soporte "23.2.1", y no tengo el problema.

  • Android ListView Despliegue hacia abajo para actualizar
  • Cómo agregar un elemento secundario en Android ListView?
  • Cómo crear una tarjeta de estilo android estilo listview
  • Android scroll mientras arrastra y suelta
  • ¿Ocultar la vista de pie en ListView?
  • Obtención de datos de lista de elementos de una lista
  • Android listview desplazamiento a número de listitems
  • Ancho y color del borde del elemento ListView de Android
  • Android ListView setOnScrollListener
  • ListView elemento seleccionado drawable
  • Diferencia entre RowId y Position en el parámetro onItemLongClick
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.