Pregunta

El objetivo es implementar una galería cuya rentabilidad adaptador listviews (en otras palabras, de desplazamiento vertical listviews incrustados en una galería de desplazamiento horizontal). De alguna manera las obras después de un poco de trabajo, pero cuando se trata de desplazarse horizontalmente, el ListView se ve muy nervioso, como que hay una cierta dificultad a que está centrada. No he observado este tipo de comportamiento con cualquier otro tipo de vista incrustada en una galería.

Esto es lo que he intentado:

En un principio, he encontrado que el ListView aplastada eventos de toque, por lo que el oyente gesto en la galería no es despedido.

Así que en el método onCreate () de la actividad, que creó un GestureDetector:

galleryGestureDetector = new GestureDetector(this, gallery);

A continuación, dentro del método getView () del adaptador Galería, después de que el ListView se ha inflado y configurado, tengo algo de código como el siguiente:

listView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        galleryGestureDetector.onTouchEvent(event);
        return true;
    }
});

En este caso he llegado incluso a la medida extrema de retornar verdadero de lo OnTouchListener para asegurar que el método onTouchEvent () de la vista de lista no se llama en realidad. El mismo comportamiento se produce nervioso. Como resultado de ello, creo que puedo descartar que compiten onTouchEvent () implementaciones entre los dos puntos de vista.

He intentado abusar del concepto TouchDelegate así extendiendo rectángulo táctil de la Galería de incluir el ListView y luego forzar el ListView delegar en ella, pero esto era un esfuerzo inútil también.

Me levantar las manos y decir que no es posible actualmente, pero la aplicación de redes sociales que los paquetes con el DroidX alguna manera lo logra!

¿Fue útil?

Solución

El problema es que ListView está interceptando eventos de toque de la galería y luego alterar la posición vista en sí. Esto es lo que conduce al efecto de ida y vuelta trepidación que veo cuando uso los componentes tal y como es. Considero que esto es un error en la galería de componentes, pero mientras tanto se puede fijar subclasificando Galería de la siguiente 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 la Galería, todo funciona muy bien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top