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.
- android listview repitiendo algunos ítems en listitem click event
- Cómo personalizar listview row android
- Implementar la sección ListView con la casilla de verificación?
- Adición de encabezados a una vista de lista de Android
- Agregar o quitar encabezado y pie de página dinámicamente
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?
- android usando setlistadapter () sin extender listactivity
- Android ListView en Actividad que se refresca en el cambio de orientación
- Obtener java.lang.ArrayIndexOutOfBoundsException en android
- Problema de cuadro de verificación de ListView en CustomAdapter
- Tratando de coger un clic en android ListView item: android: descendantFocusability = "blocksDescendants" no funciona
- Añadir imagen de perfil a la vista de lista en el cajón de navegación
- Cómo mantener la posición de la barra de desplazamiento en android listview?
- Android: Actualizar ListView después de que Thread carga los datos desde la red
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.