21

Podría explicar el método getView() de ArrayAdapter.Explicación del método getView() de un ArrayAdapter

que lea la documentación y tiene tres parámetros:

  • position: La posición del elemento dentro de los datos del sistema de adaptador de el elemento cuya visión que queremos.
  • convertView: la antigua vista para reutilizar, si es posible. Nota: debe verificar que esta vista no sea nula y de un tipo apropiado antes de usarla. Si no es posible convertir esta vista para mostrar los datos correctos, este método puede crear una nueva vista.
    Las listas heterogéneas pueden especificar su número de tipos de vista, de modo que esta vista sea siempre del tipo correcto (vea getViewTypeCount() y getItemViewType (int)).
  • parent: El padre que este punto de vista, finalmente, se adjuntará a

I entiende el parámetro position. Como dijeron, implica la posición del artículo, quién ha sido solicitado.

de dónde viene convertView. He visto muchos ejemplos donde verifican si convertView es nulo. Si es nulo, inflan una nueva instancia del diseño de fila, lo rellenan y lo devuelven. Creo que también he entendido eso, pero una cosa todavía me desconcierta. ¿Cuál es el diseño que se pasa a través del parámetro convertView? ¿Es the resource parameter that is passed in when initialising the ArrayAdapter? ¿Es una copia en caché del último diseño devuelto por getView()?

Y por último. ¿Qué hace el parámetro parent? No he visto demasiados ejemplos que utilizan esto. La mayoría de ellos simplemente reutiliza/inflan un diseño de fila y lo devuelven.

(Lo digo porque tengo una animación en clic en mi ListView. Específicamente this one that aims to replicate Spotify's dropdown quick action menu. Mi animación ha sido un poco lento. Después de diagnosticar este problema por un tiempo, me he dado cuenta de que esto se ha debido a el hecho de que mi método getView() tarda un poco en completarse ya que estoy inflando un nuevo diseño de fila en cada iteración. Alguien sugirió almacenar en caché el diseño de fila en un ViewHolder mientras que otros ejemplos apuntan a reutilizar el parámetro convertView, es decir, solo inflar un diseño de fila si convertView es nulo.)

Respuesta

44

¿Es una copia en caché del último diseño devuelto por getView()?

El convertView es la vista de una fila que dejó la pantalla (lo que no es la última vista devuelto por el método getView). Por ejemplo, la lista se muestra primero, en este caso convertView es null, no se construyó previamente la vista de fila y salió de la pantalla. Si se desplaza hacia abajo, la fila 0 saldrá de la pantalla (ya no será visible), cuando eso suceda, el ListView puede elegir mantener esa vista en un caché para usarla más adelante (esto tiene sentido, ya que las filas de un ListView generalmente el mismo diseño con solo los datos siendo diferentes). La razón para mantener algunas vistas en una memoria caché y luego utilizarlas es porque el método getView se puede llamar muchas veces (cada vez que el usuario se desplaza hacia arriba/abajo y aparecen nuevas filas en la pantalla). Si cada vez que se necesita volver a crear la vista de filas, esto daría lugar a la creación de muchos objetos, lo cual es algo que hay que evitar.En su método getView, debe marcar convertView para ver si es null. Si es null, entonces debe construir una nueva vista de fila y rellenarla con datos, si no es null, el ListView le ofreció una vista previa. Tener esta vista previa significa que no necesita construir un nuevo diseño de fila, en su lugar debe poblarlo con los datos correctos, ya que esa vista almacenada en caché tiene los datos antiguos todavía adjuntos (vería muchas preguntas en stackoverflow donde los usuarios preguntan por qué las filas de su ListView se están duplicando cuando se desplazan hacia abajo).

Qué hace el parámetro padre. No he visto demasiados ejemplos utilizando esto. La mayoría de ellos simplemente reutilizan/inflan un diseño de fila y lo devuelven .

Se debe utilizar para obtener el LayoutParams correcto para la fila recién inflada/construida. Por ejemplo, si infla un diseño que tiene un RelativeLayout como raíz y no usa el parent para obtener el LayoutParams, podría tener algunos problemas con el diseño de la fila. Para tomar los padres en consideración se debería utilizar:

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false); 
+3

¡Esta es una muy buena respuesta! – Tarik

+0

la mejor respuesta tnx –

2

Mi comprensión de convertView es que es esencialmente puntos de vista que han sido reciclados porque no están siendo utilizados en el momento - por ejemplo, se desplaza hacia abajo en la lista, los que están en la parte superior no están en la pantalla, por lo que se pasan a este parámetro para usarlos cuando se necesita una nueva vista (para que no tenga que crear uno nuevo mientras tiene los que están sin usar). iOS tiene un método similar llamado dequeueReusableCellWithIdentifier. Si cada fila de su vista de lista tiene la misma estructura, es seguro enviar esto al tipo apropiado y simplemente actualizar la información en él - texto, imágenes, etc. Será una Vista que fue devuelta previamente por una llamada getView() para el mismo tipo lista.

Mi mejor estimación (y es cierto que es una suposición) con parent es que es la vista de la que la lista de este adaptador es hija. Le brinda una ruta de regreso al sistema de representación si necesita un contexto, acceso al sistema de recursos, para pasar información a la vista principal de la lista o recibir información de la misma.

Cuestiones relacionadas