android - recyclerview - viewholder multiple views
Métodos getViewTypeCount y getItemViewType de ArrayAdapter (3)
¿Puede alguien en palabras simples explicarme el uso de los getViewTypeCount()
y getItemViewType()
de ArrayAdapter
?
Éstos manejan el caso donde desea diferentes tipos de vista para diferentes filas. Por ejemplo, en una aplicación de contactos, es posible que desee que incluso las filas tengan imágenes en el lado izquierdo y las filas impares para tener imágenes a la derecha. En ese caso, usarías:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
El marco utiliza su tipo de vista para decidir qué vistas le entregará a través de convertView
en su método getView
. En otras palabras, en el ejemplo anterior, sus filas pares solo obtendrán vistas recicladas con imágenes en el lado izquierdo para reutilizar, y las filas impares solo obtendrán las que tengan imágenes a la derecha.
Si cada fila en su lista tiene el mismo diseño, no necesita preocuparse por los tipos de vista. De hecho, BaseAdapter.java proporciona un comportamiento predeterminado para todos los adaptadores:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
De hecho, esto le proporciona el mismo tipo de vista para cada fila.
Editar - para delinear el flujo general:
-
AdapterView
datos a suAdapterView
utilizando un adaptador. -
AdapterView
intenta mostrar elementos que son visibles para el usuario. - El framework llama a
getItemViewType
para la filan
, la fila que está a punto de mostrar. - El marco revisa su grupo de vistas recicladas para ver el tipo de fila
n
. No encuentra ninguno porque aún no se han reciclado las vistas. - Se llama a
getView
para la filan
. - Llama a
getItemViewType
para la filan
para determinar qué tipo de vista debe usar. - Utiliza una instrucción if / switch para inflar un archivo xml diferente según el tipo de vista que se requiera.
- Usted llena la vista con información.
-
getView
la vista, sale degetView
y la vista de su fila se muestra al usuario.
Ahora, cuando una vista se recicla desplazándose fuera de la pantalla, ingresa en un grupo de vistas recicladas administrado por el marco. Estos están esencialmente organizados por tipo de vista para que se le proporcione una vista del tipo correcto en el parámetro convertView
en su método getView
:
- El marco de nuevo llama a
getItemViewType
para la fila que quiere mostrar. - Esta vez, hay una vista en el grupo reciclado del tipo apropiado.
- La vista reciclada se le pasa como el parámetro
convertView
a su métodogetView
. - Rellenas la vista reciclada con nueva información y la devuelves.
Si necesitamos mostrar diferentes tipos de vista en la vista de lista, entonces es bueno usar getViewTypeCount()
y getItemViewType()
en el adaptador en lugar de alternar una vista View.GONE
y View.VISIBLE
puede ser una tarea muy costosa dentro de getView()
que afectar la lista de desplazamiento.
Verifique este para el uso de getViewTypeCount()
y getItemViewType()
en el Adaptador.
Enlace: the-use-of-getviewtypecount
¡Cuidado con Outttt!
Tuve que enfrentarme a un problema al implementar un ListView
ayer y son dos tipos de vistas para las filas que se mezclaron justo después de desplazarme. Aunque la respuesta más votados dentro de este hilo da una buena explicación general, no ha resaltado la información más importante para detener el error de UI anterior que he mencionado.
Aquí está mi explicación:
Tanto getViewTypeCount()
como getItemViewType()
están siendo utilizados por el método getView
para averiguar qué tipo de vista se debe recuperar, reciclar y devolver. (como se explica en la respuesta superior dentro del hilo). Pero si no implementa estos dos métodos de forma intuitiva de acuerdo con el API API de Android, entonces puede entrar en el problema que mencioné.
Guía resumida para la implementación:
Para implementar múltiples tipos de Views
para las filas de ListView
, debemos implementar esencialmente los getItemViewType()
y getViewTypeCount()
. Y la documentación getItemViewType()
nos da una Nota de la siguiente manera:
Nota: los enteros deben estar en el rango
0
paragetViewTypeCount() - 1
.IGNORE_ITEM_VIEW_TYPE
también puede ser devuelto.
Por lo tanto, en getItemViewType()
debe devolver valores para el tipo de vista, comenzando desde 0 hasta el último tipo (número de tipos - 1). Por ejemplo, supongamos que solo tiene tres tipos de vistas. De modo que, dependiendo del objeto de datos para la vista, solo puede devolver 0, 1 o 2 del método getItemViewType()
, como un índice de matriz basado en cero. Y como tiene tres tipos de vistas utilizadas, su método getViewTypeCount()
debe devolver 3.
En cualquier caso, si devuelve cualquier otro valor entero como 1, 2, 3 o 111, 222, 333 para este método definitivamente puede experimentar el error de UI anterior que acaba de colocar al no obedecer al Android API Doc.
Si no obtuvo la pista o si aún no puede resolverla y necesita más información, lea mi respuesta detallada dentro de este hilo de preguntas y respuestas de .
Lea el documento de desarrollador de Android para obtener más información, es posible que encuentre la pista directamente.
¡Espero que esta respuesta sea útil para alguien que está ahorrando muchas horas!
¡¡¡Aclamaciones!!!