Preparando una vista de detalles de una aplicación de Android, me he encontradoo con un curioso funcionamiento. La idea de la vista es tener un LinearLayout e ir metiendole en tiempo de ejecución pequeñas vistas que constan de un LinearLayout con un TextView para el titulo y un ListView con unos pasos. Puesto que la vista puede quedar más grande que la pantalla, todo encerrado dentro de un ScrollView. Pero por lo visto hay un pequeño bug, que cuando se encierran un ListView dentro de un ScrollView, en vez de hacer Scroll a toda el conjunto, “obliga” a los ListView a hacer scroll haciendo que su alto sea más pequeño.
Buscando por la red sobre este problema, en todos los foros y listas de desarrollares dicen que es un problema de Google que aún no han solucionado y la mejor “solución” es no poner un ListView dentro de un ScrollView. Aunque por suerte, dí con la siguiente solución , que llamando esta función:

<pre>  public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }
</pre>

Y lo que hace es poner el tamaño del listview justo para que se muestren todos los hijos. Aunque tiene el problema que si tiene muchos hijos con bastante contenido que renderizar, puede tardar bastante.
Aún así, para ir saliendo del paso, va bastante bien.

« »