setadapter new getposition ejemplo custom arrayadapter array java android android-listview android-arrayadapter android-adapter

java - new - custom listview android



Explicación del método getView() de un ArrayAdapter (2)

¿Podría explicar el método getView() de un ArrayAdapter ?

Leo los documentos y tiene tres parámetros:

  • position : la posición del elemento dentro del conjunto de datos del adaptador del elemento cuya vista queremos.
  • convertView : la vista anterior 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 siempre sea del tipo correcto (vea getViewTypeCount () y getItemViewType (int)).
  • parent : el padre al que se adjuntará esta vista con el tiempo

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

¿De convertView 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 el parámetro de resource que se transfiere al inicializar 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 estoy preguntando porque tengo una animación en clic en mi ListView . Específicamente esta que pretende replicar el menú de acción rápida desplegable de Spotify . Mi animación ha sido un poco lenta. Después de diagnosticar este problema por un tiempo, me di cuenta que esto se debe al hecho de que mi método getView() toma un poco de tiempo para completarse ya que estoy inflando un nuevo diseño de fila en cada iteración. Alguien sugirió almacenar 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.)


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

El convertView es la vista de una fila que salió de la pantalla (por lo que no es la última vista devuelta por el método getView ). Por ejemplo, la lista se muestra primero, en este caso convertView es null , no se construyó previamente una vista de fila y salió de la pantalla. Si se desplaza hacia abajo, la fila 0 saldrá de la pantalla (ya no estará visible), cuando eso suceda, 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 tienen el mismo diseño con solo los datos siendo diferentes). La razón para mantener algunas vistas en un caché y luego usarlas es porque el método getView podría llamarse 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 , debería verificar convertView para ver si es null . Si es null entonces debe compilar una nueva vista de fila y completarla con datos; si no es null , ListView le ofreció una vista previa. Tener esta vista previa significa que no necesita construir un nuevo diseño de fila, sino que debe rellenarlo con los datos correctos, ya que esa vista almacenada en caché tiene los datos antiguos todavía adjuntos (vería muchas preguntas en donde los usuarios preguntan por qué las filas de su ListView están duplicando cuando se desplazan hacia abajo).

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

Se debe usar para obtener los LayoutParams correctos 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 elemento parent para obtener LayoutParams , podría tener algunos problemas con el diseño de la fila. Para tomar en consideración al padre, usaría:

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


Mi comprensión de convertView es que básicamente se trata de vistas que se han reciclado porque no se están utilizando en este momento; por ejemplo, se desplaza hacia abajo en la lista, las que están en la parte superior no aparecen en la pantalla, por lo que se pasan a este parámetro se usa cuando necesitas una nueva vista (para que no tengas que crear una completamente nueva mientras tienes las que están sin usar sentadas al ralentí). 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 previamente devuelta por una getView() a getView() para la misma lista

Mi mejor suposición (y es cierto que es una suposición) con los 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.