ViewFlipper y onTouchListener en el encabezado de listView

En mi aplicación, tengo un listView. Tengo un ViewFlipper que es el encabezado de ListView.

Quiero que ViewFlipper cambie de vista cuando el usuario lo toque y deslice. Además, se puede hacer clic en los elementos de ViewFlipper. Mi problema es que mi ListView también se puede desplazar, pero verticalmente y se puede hacer clic.

Aquí hay un esquema:

enter image description here

Primero, traté de usar un OnTouchEvent. No funcionó porque se llama al método incluso si el usuario toca la pantalla FUERA del ViewFlipper.

Ahora, si uso un OuTouchListener, no puedo interceptar el gesto del usuario y no puedo descifrarlo.

Aquí hay una muestra del código XML para el encabezado de listView:

<ViewFlipper
    android:id="@+id/flipune"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="3" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/itemviewflipper1"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:background="@android:color/transparent"
            android:contentDescription="@string/stritemviewflipper" />

        <TextView
            android:id="@+id/titreviewflipper1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/itemviewflipper1"
            android:background="#AA000000"
            android:paddingTop="10dip"
            android:textColor="#ffffffff"
            android:textSize="12dip"
            android:textStyle="bold" >
        </TextView>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/itemviewflipper2"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:background="@android:color/transparent"
            android:contentDescription="@string/stritemviewflipper" />

        <TextView
            android:id="@+id/titreviewflipper2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/itemviewflipper2"
            android:background="#AA000000"
            android:paddingTop="10dip"
            android:textColor="#ffffffff"
            android:textStyle="bold" >
        </TextView>
    </RelativeLayout>

        [...]

</ViewFlipper>

Y definí el OnTouchListener en la actividad:

viewFlipper.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent touchevent) {
                switch (touchevent.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    oldTouchValue = touchevent.getX();
                    break;
                }
                case MotionEvent.ACTION_UP: {           

                    float currentX = touchevent.getX();
                    if (touchevent.getY() < metrics.heightPixels / 3) {
                        if (!viewFlipper.isPressed() && oldTouchValue == currentX) {
                            openDescriptionArticle(index);
                        } else {
                            if (oldTouchValue < currentX) {
                                viewFlipper.setInAnimation(AnimationHelper
                                        .inFromLeftAnimation());
                                viewFlipper.setOutAnimation(AnimationHelper
                                        .outToRightAnimation());
                                viewFlipper.showPrevious();
                                if (index > 0) {
                                    index--;
                                } else {
                                    index= 4;
                                }
                            }
                            if (oldTouchValue > currentX) {
                                viewFlipper.setInAnimation(AnimationHelper
                                        .inFromRightAnimation());
                                viewFlipper.setOutAnimation(AnimationHelper
                                        .outToLeftAnimation());
                                viewFlipper.showNext();
                                if (index < 4) {
                                    index++;
                                } else {
                                    index = 0;
                                }
                            }
                        }
                    }
                    break;
                }
                }
                return false;
            }
        });

preguntado el 30 de junio de 12 a las 16:06

no está muy claro lo que está tratando de lograr en función de lo que ha escrito aquí. -

mira el enlace de la respuesta stackoverflow.com/a/11271615/582571 -

Revisé los enlaces pero creo que no responde a mi problema. De hecho, puedo desplazar mi ListView y deslizar mi ViewFlipper, pero cuando desplazo mi ListView, ViewFlipper muestra los elementos siguientes o anteriores Y el ListView se desplaza. Ambas acciones funcionan, pero solo quiero una de ellas (cuando desplazo ListView FUERA de ViewFlipper, ViewFlipper no debería moverse y cuando deslizo ViewFlipper, ListView tampoco debería moverse). -

¿Se te ocurrió una solución para esto? En el mismo barco ahora. -

1 Respuestas

En mi caso hay un HorizontalPager dentro ListView encabezamiento. ListView captura el evento táctil y el buscapersonas se congela. He resuelto el problema implementando custom ListView con scrollingEnabled .

public class StoppableListView extends ListView {
    public boolean scrollingEnabled = true;
    YourActivity parent;

    public StoppableListView(Context context) { super(context); parent = (CalendarActivity)context; }
    public StoppableListView(Context context, AttributeSet attrs) { super(context, attrs); parent = (CalendarActivity)context; }
    public StoppableListView(Context context, AttributeSet attrs, int defStyle) { super(context,attrs); parent = (CalendarActivity)context; }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (scrollingEnabled) return super.dispatchTouchEvent(ev);
        // dispatch touch event to your view
        else return parent.yourView.dispatchTouchEvent(ev);
    }

} 

Cuando el buscapersonas está activo, configuro listView.scrollingEnabled = false y el evento se envía correctamente al buscapersonas.

respondido 22 mar '13, 13:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.