Deshabilitar el desplazamiento de una vista de lista contenida dentro de una vista de desplazamiento


Quiero mostrar una pantalla de Perfil para mis usuarios.

Debe tener tres vistas (2 Buttons y a ImageView) y a ListView para mostrar el contenido realizado por ese usuario.

Sin embargo, no quiero que el ListView se desplace. En cambio, quiero que sea tan grande como sea necesario, y poner todas mis vistas dentro de un ScrollView, para que las tres primeras vistas se desplacen con el ListView. Esto, por supuesto, no funciona como estaba previsto.

Todos mis tres elementos están dentro de un LinearLayout. Pensé en hacer de ellos el primer elemento en el ListView, pero esto lleva a que sean seleccionables como el primer elemento, y tengan que hacer alguna codificación innecesaria.

¿Hay alguna manera de hacer esto de la manera fácil o tendré que seguir haciendo que el Diseño sea el primer elemento en mi ListView?

Author: Edward Brey, 2012-08-31

7 answers

Agregarlos a la vista de lista como primer elemento parece una solución bastante buena.

Para que la vista no sea seleccionable, simplemente obtenga la vista y .setClickable(false).

 7
Author: Yalla T.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-31 10:20:07

Encontré una solución muy simple para esto. Simplemente obtenga el adaptador de listview y calcule su tamaño cuando se muestren todos los elementos. La ventaja es que esta solución también funciona dentro de un ScrollView.

Ejemplo:

public static void justifyListViewHeightBasedOnChildren (ListView listView) {

    ListAdapter adapter = listView.getAdapter();

    if (adapter == null) {
        return;
    }
    ViewGroup vg = listView;
    int totalHeight = 0;
    for (int i = 0; i < adapter.getCount(); i++) {
        View listItem = adapter.getView(i, null, vg);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams par = listView.getLayoutParams();
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
    listView.setLayoutParams(par);
    listView.requestLayout();
}

Llama a esta función pasando sobre tu objeto ListView:

justifyListViewHeightBasedOnChildren(myListview);

La función mostrada arriba es una modidicación de un post en: Desactivar el desplazamiento en listview

Tenga en cuenta que debe llamar a esta función después de haber configurado el adaptador listview. Si el tamaño de las entradas en el adaptador ha cambiado, también necesita llamar a esta función.

 43
Author: Chris623,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:42

Usted puede hacer esto por

listView.setScrollContainer(false);

Para más información, consulte

¿Cómo obtener una vista de lista no desplazable?

 11
Author: Saifuddin Sarker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:30

Añadiría un View con fondo invisible encima de ListView. Pon a View.OnTouchListener(). Y consume el evento devolviendo true en el método onTouch() de View.OnTouchListener().

Cuando desee que la lista se desplace de nuevo, elimine el oyente táctil establecido en el transparente View

 5
Author: Sudarshan Bhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-18 12:54:32

Si tiene que mostrar un número limitado de elementos en la vista de lista y desea evitar que la vista de lista se desplace, debe mantener la altura de la vista de lista mayor que la altura total de los elementos.

Por ejemplo, desea mostrar 3 elementos. (la altura de la fila es 30). entonces la altura total de los artículos se convierte 3 x 30dp = 90dp,

Así que ahora tienes que establecer la altura de listview mayor que 90. por ejemplo: 100dp. así que ahora su listview no se desplazará en ningún caso.

 3
Author: Usman Nisar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-07 12:29:01

Creo que la mejor manera sería poner los 2 botones y la vista de imagen en un LinearLayout (o cualquier diseño que se adapte a su necesidad) y agregar este diseño como el encabezado de la lista utilizando el método addHeaderView:

Http://developer.android.com/reference/android/widget/ListView.html#addHeaderView(android.view.View)

 2
Author: Olivier Bonal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-31 23:37:44

Con la siguiente instrucción:

name_lista.getLayoutParams (). height = new_size

New_size es una variable que calcularás en función del número de elementos de tu lista, por ejemplo:

new_size = 100 * list_size;
 0
Author: fredy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-09 18:09:38