En Android, cuando se tiene un ListView, dentro de un ScrollView, es posible que el último capture todos los eventos onTouch, y no sea posible utilizar el ListView.

Para solucionar el problema, bastaría con deshabilitar la captura del evento onTouch para el ScrollView, si lo que estamos pulsando es el ListView, es decir:



Al ScrollView, le añadimos un evento onTouch. Dentro, recuperaremos el ListView, para deshabilitar en su padre la intercepción de eventos onTouch. En éste caso, el padre del ListView es el ScrollView.


miScrollView.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        findViewById(R.id.miListView).getParent()
                .requestDisallowInterceptTouchEvent(false);
        return false;
    }
});

Al ListView, le añadimos también un onTouch, y haremos el proceso inverso.


miListView.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        v.getParent().requestDisallowInterceptTouchEvent(true);
        return false;
    }
});

La documentación oficial del método es:

Called when a child does not want this parent and its ancestors to intercept touch events with onInterceptTouchEvent(MotionEvent). This parent should pass this call onto its parents. This parent must obey this request for the duration of the touch (that is, only clear the flag after this parent has received an up or a cancel. Parameters disallowIntercept True if the child does not want the parent to intercept touch events.

Es decir, le pasaremos true cuando la vista hija no quiera que el padre intercepte eventos onTouch.

Índice