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í
- "Presione y mantenga presionado" en Android necesita cambiar estados (selector XML personalizado) usando onTouchListener
- Android: pasar el evento de gestos a otra vista
- OnTouchListener para toda la pantalla
- ¿Qué sucede realmente si devuelvo falso en un OnTouchListener?
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!
- Pase Android NestedScrollView desplazamientos horizontales a un padre Ver
- Imagen en lienzo con eventos táctiles
- Cómo combinar OnClickListener y OnTouchListener para un ImageButton
- Android: ¿Qué uso tiene AnchorView de MediaController?
- EditText en ListView pierde foco cuando se presiona en Android 4.x
- Método único para implementar onTouchListener () para varios botones
- ¿Cómo manejar hacer clic en las vistas secundarias y tocar en los ViewGroups de los padres?
- Obtener coordenadas reales de xy de los usuarios
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?