Pregunta

Tengo una acumulación de vistas bastante compleja, y como parte de eso, tengo una vista de lista dentro de un LinearLayout dentro de una vista de desplazamiento (y muchos más componentes, pero no importan en este tema).

Ahora toda la actividad se desplaza muy bien como debería, pero la vista de lista tiene una altura limitada, y cuando los elementos dentro de ella superan la altura, la desaparición de mi pantalla. He intentado colocar la vista de lista dentro de su propia vista de desplazamiento, pero esto no funciona. Cuando intento desplazarme en ListView, se selecciona el ScrollView principal y mi pantalla se desplaza en lugar de ListView.

Mi pregunta puede sonar fácil, pero no he podido solucionar esto ... ¿es posible hacer que ListView también se desplace?

El XML relevante:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

    <LinearLayout android:id="@+id/GlobalLayout" 
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:orientation="vertical" >

        <ListView android:id="@+id/EndpointList"
                  android:choiceMode="multipleChoice"
                  android:layout_height="175dip"
                  android:layout_width="fill_parent" />

    </LinearLayout>

</ScrollView>
¿Fue útil?

Solución 2

En realidad, la forma en que lo tengo configurado realmente está funcionando ... colocar una vista de lista en un LinearLayout dentro de una vista de desplazamiento. Simplemente evite que ListView sea el niño directo de ScrollView, y funcionará bien ...

Solo tenga en cuenta que si no hay suficientes elementos en ListView para llenarlo para que salga 'fuera de la pantalla', que no se desplazará (aunque lógicamente). También tenga en cuenta que cuando tiene suficientes elementos para desplazarse, debe seguir presionando un elemento en ListView para que se desplace, y la mitad del tiempo, el enfoque se da al Global ScrollView en lugar de ListView ... a Evite esto (la mayor parte del tiempo), siga presionando el elemento más superior o más abajo, dependiendo de la forma en que desee desplazarse. Esto optimizará su oportunidad de enfocarse en su View de ListView.

He hecho un video que es posible, lo estoy subiendo ahora a YouTube ...

El video es http://www.youtube.com/watch?v=c53oig_3lky. La calidad es un poco mala, pero demuestra mi punto.

Solo para una descripción general global, utilicé el ScrollView para poder desplazar toda mi actividad, el LinealLayout para el diseño de la actividad y la vista de lista para, bueno, hacer la lista ...

Otros consejos

En lugar de ListView con otros diseños dentro de ScrollView, cree una View de Listview con encabezado y pie de página.

Agregue vistas que deberían estar anteriormente ListView como encabezado:

addHeaderView(View v)

y que a continuación como pie de página:

addFooterView(View v)

Ponga todo lo que debería estar por encima de ListView en el encabezado de ListView y lo mismo con el pie de página.

    LayoutInflater inflater = LayoutInflater.from(this);
    mTop    = inflater.inflate(R.layout.view_top, null);
    mBottom = inflater.inflate(R.layout.view_bottom, null);

    list.addHeaderView(mTop);
    list.addFooterView(mBottom);
    // add header and footer before setting adapter
    list.setAdapter(mAdapter);

En resultado, obtendrá una vista desplazable.

Prueba este código puede ayudarlo

        ListView listView = ( ListView ) findViewById(R.id.lsvButton3);
        listView.setOnTouchListener(new ListView.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        // Disallow ScrollView to intercept touch events.
                        v.getParent().requestDisallowInterceptTouchEvent(true);
                        break;

                    case MotionEvent.ACTION_UP:
                        // Allow ScrollView to intercept touch events.
                        v.getParent().requestDisallowInterceptTouchEvent(false);
                        break;
                }

                // Handle ListView touch events.
                v.onTouchEvent(event);
                return true;
            }
        });

Me gustaría tener en cuenta algo para el video

El ListView funciona una vez que cada X toca no porque lo colocó dentro de un LinearLayout, sino porque está tocando el divisor ...

El ScrollView considerará que el lugar que tocó no tiene hijos para enviar el MotionEvent ... por lo que llama al Super.DispatchTouchEvent, que en este caso es la vista.

Cuando toca dentro de una fila, el ScrollView, que es realmente un grupo de vista, enviará el envío a los niños en su caso el View de TextView y nunca llama al uno de los Vistas para que ListView no se desplace.

Espero que mi explicación haya sido lo suficientemente clara como para señalar por qué no funciona.

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