2010-10-26 7 views
8

Acabo de agregar un encabezado a mi ListView y tengo que cambiar un montón de código porque el encabezado se convierte esencialmente en la posición 0 (lo que significa que los índices de Cursor de mi CursorAdapter no se alinean con las indicaciones de la lista. por 1 ahora). ¿Por qué? Esto me parece un poco tonto.¿Hay una buena razón para que un encabezado ListView tome una posición?

La única razón por la que se me ocurre es que un desarrollador puede querer acceder al encabezado. Multa. Proporcione algo como getListView(). GetHeader().

+2

Simplemente espere hasta que tenga que colocar sus propios encabezados de sección. Eso es una pesadilla. – Falmarri

+0

Siempre que se refiera al Adaptador asociado a la lista, no debería tener problemas uno por uno. Agregar encabezados/pies de página ajusta su Adaptador y hace estos ajustes por usted. –

+0

Puedo poner mis propios encabezados de sección muy bien. Con un ArrayAdapter, mis encabezados de sección son elementos reales de la lista. Con un CursorAdapter, cada elemento tiene un encabezado como parte de su Vista, pero solo se muestra para el elemento superior de cada sección. El problema con ambos enfoques es que el encabezado desaparece; por lo que podría terminar con una lista llena de elementos y no saber en qué encabezado están porque el encabezado se desplazó por la parte superior de la pantalla. Estaba experimentando con los encabezados de ListView para evitar esto, pero aparentemente también se desplazan. – Andrew

Respuesta

1

Creo que un ListView no es más que una lista de View elementos. Si agrega un encabezado (o un pie de página, no debería hacer ninguna diferencia) a su ListView, ese elemento básicamente no es diferente de cualquiera de los otros elementos que se agrega automáticamente a través del ListAdapter. La única diferencia menor es que el elemento del encabezado (y del pie de página) se arreglará y no se verá afectado por lo que hace el ListAdapter con la lista, aunque todavía no son más que elementos comunes.

21

Por alguna razón el position (del onItemClick) está vinculado con el número de elementos en el ListView (no el adaptador), incluyendo los encabezados y pies de página. Cuando configura un OnItemClickListener, debe recuperar el elemento cliqueado llamando al listView.getItemAtPosition(position) en lugar de adapter.getItem(position).

De hecho, siempre se debe utilizar el getItemAtPosition, porque de esa manera no importa si su ListView tiene cabeceras y pies de página, y si se agrega nuevas cabeceras que no tendrá que cambiar su código.

Y si no desea que su encabezado sea seleccionable, debe agregarlo de esta manera: listView.addHeaderView(headerView, null, false).

+0

Nice One. +1 de mi lado. –

Cuestiones relacionadas