Incorporación de ListView dentro de la Galería
El objetivo es implementar una Galería cuyo adaptador devuelve ListViews (en otras palabras, desplazamiento vertical de ListViews incrustado en una galería de desplazamiento horizontal). Es una especie de obras después de un poco de trabajo, pero al intentar desplazarse horizontalmente, el ListView se ve muy nervioso, como hay cierta adherencia a que se centra. No he observado este tipo de comportamiento con ningún otro tipo de Vista incrustado en una Galería.
Esto es lo que he intentado:
- Usando OnTouchListener y OnLongClickListener interfiere entre sí
- Cómo agregar la funcionalidad de deslizar en Android CardView?
- SwipeListView sólo un elemento abierto a la vez
- Android: Detectar el botón ACTION_UP fuera del evento
- Cambiar la altura del diseño relativo con la misma velocidad que el dedo del usuario Se mueve en el diseño
Inicialmente, encontré que el ListView aplastó eventos táctiles, por lo que el oyente gesto en la Galería nunca se despide.
Así que en el método onCreate () de la actividad, he creado un GestureDetector:
galleryGestureDetector = new GestureDetector(this, gallery);
Entonces, dentro del método getView () del adaptador de Galería, después de que el ListView se haya inflado y configurado, tengo un código como este:
listView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { galleryGestureDetector.onTouchEvent(event); return true; } });
En este caso, incluso he ido al paso extremo de devolver true desde OnTouchListener para asegurarme de que el método onTouchEvent () de la listView nunca se llame realmente. Ocurre el mismo comportamiento nervioso. Como resultado, creo que puedo descartar las implementaciones onTouchEvent () entre las dos vistas.
Intenté abusar del concepto de TouchDelegate, extendiendo el rectángulo táctil de la Galería para incluir el ListView y forzar el ListView a delegarle, pero esto también fue un esfuerzo inútil.
Me gustaría levantar las manos y decir que no es posible en la actualidad, pero la aplicación de redes sociales que los paquetes con el DroidX de alguna manera lo logra!
- Android deja de enviar eventos onTouch
- android arrastrar y soltar ImageView onTouchListener
- Reducir animadamente el tamaño del botón en la prensa y recuperar su tamaño en la versión
- cómo deslizar un evento button onTouch en android
- Limitación de Drag de ImageView en Android
- Obtener elemento de ListView sólo con OnTouchListener
- ¿Cómo manejar hacer clic en las vistas secundarias y tocar en los ViewGroups de los padres?
- ¿Qué sucede realmente si devuelvo falso en un OnTouchListener?
El problema es que ListView está interceptando eventos táctiles de la Galería y luego alterando la posición de vista en sí. Esto es lo que conduce al efecto jittering hacia adelante y hacia atrás que veo cuando uso los widgets tal cual. Considero esto un error en el widget Galería, pero mientras tanto se puede arreglar mediante la subclase de la Galería de esta manera:
public class BetterGallery extends Gallery { private boolean scrollingHorizontally = false; public BetterGallery(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public BetterGallery(Context context, AttributeSet attrs) { super(context, attrs); } public BetterGallery(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { super.onInterceptTouchEvent(ev); return scrollingHorizontally; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { scrollingHorizontally = true; return super.onScroll(e1, e2, distanceX, distanceY); } @Override public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: scrollingHorizontally = false; } return super.onTouchEvent(event); }
}
Si utiliza BetterGallery en lugar de Gallery, todo funciona bien!
- Emulador de Android – Cómo emular la acción de conexión de auriculares
- ¿Cómo acceder al almacenamiento extraíble en dispositivos Android?