2011-07-03 13 views
9

Estoy trabajando en una aplicación de Android con ListView y estoy en el proceso de optimizarla. Utiliza un adaptador de cursor personalizado en una actividad y noté que bindview() se activaba dos veces para cada fila de la lista. Mientras investigaba los métodos BindView() y NewView() aquí, leí en una publicación que tener Wrap_Content para el ancho de mi lista era una mala idea. Lo cambié a Fill_Parent y viola ahora bindview() y newview() cada fuego solo una vez para cada elemento.¿Por qué Wrap_Content dispara BindView más de una vez?

Para comprender mejor las funciones internas del sistema operativo Andorid, me gustaría saber por qué Wrap_Content provocó que bindview() se disparara varias veces.

He realizado varias búsquedas en Google, los documentos para desarrolladores de Android y aquí sin suerte.

Cualquier respuesta es realmente apreciada.

Gracias, George

Respuesta

10

si recuerdo correctamente desde un vídeo de Google I/O, el establecimiento de la anchura (o altura) de un ListView a wrap_content hará que se miden los 3 primeros puntos y la base de sus dimensiones fuera de esos. Para medir esos primeros 3 elementos, debe llamar al bindView() para completarlos. Una vez que ha medido, se completará completamente y llamará nuevamente al bindView() en esos primeros 3 y posteriores.

Esto se debe a que el ListView solo conserva en la memoria lo que está en la pantalla cuando puede tener potencialmente un número infinito de elementos en la lista. No está diseñado para wrap_content a su artículo más grande porque podría quedar atrapado en la fase de dibujo para siempre.

+2

Correcto, respondí una pregunta similar (http://stackoverflow.com/questions/6557240/expandablelist-getchildview-running-twice-per-child/6557284#6557284) ayer. El video/hora se proporciona allí. – dmon

+1

Sí, esto es correcto. ListView ocasionalmente llamará a getView de su adaptador para fines de medición. No hay garantías de que el resultado de cualquier llamada a getView se publique en la pantalla, o que la llamada más reciente a getView sea relevante para lo que se está mostrando actualmente. – adamp

+0

Gracias por la Respuesta Glendon. Exactamente lo que estaba buscando. –

Cuestiones relacionadas