¿Puede alguien en palabras simples explicarme el uso getViewTypeCount()
y los getItemViewType()
métodos de ArrayAdapter
?
Estos 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 las filas pares tengan imágenes en el lado izquierdo y las filas impares tengan imágenes en el derecho. En ese caso, usarías:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
El marco de trabajo utiliza su tipo de vista para decidir qué vistasconvertView
getView
utilizar en su método . 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 aquellas con imágenes a la derecha.
Si cada fila de 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
utilizando un adaptador.AdapterView
intentos para mostrar los elementos que son visibles para el usuario.getItemViewType
fila n
, la fila que está a punto de mostrar.n
tipo de fila . No encuentra ninguna porque aún no se han reciclado las vistas.getView
se llama para fila n
.getItemViewType
a una fila n
para determinar qué tipo de vista debe usar.getView
, y la vista de su fila se muestra al usuario.Ahora, cuando una vista se recicla desplazándose fuera de la pantalla, pasa a un grupo de vistas recicladas que administra el marco. Estos están esencialmente organizados por tipo de vista para que se le proporcione una vista del tipo correcto en el convertView
parámetro de su getView
método:
getItemViewType
a la fila que desea mostrar.convertView
parámetro de su getView
método.
Si necesitamos mostrar diferentes tipos de vista en la vista de lista, entonces es bueno usarla
getViewTypeCount()
ygetItemViewType()
en el adaptador en lugar de alternar una vistaView.GONE
yView.VISIBLE
puede ser una tarea muy costosagetView()
que afectará el desplazamiento de la lista.Por favor, compruebe este para el uso de
getViewTypeCount()
ygetItemViewType()
en el adaptador.Enlace: the-use-of-getviewtypecount
fuente
Mira Outttt !!!!
Tuve que enfrentar un problema al implementar un
ListView
ayer y sus dos tipos de vistas para filas se mezclaron justo después de desplazarlo. A pesar de que la respuesta más votada dentro de este hilo da una buena explicación general, no ha resaltado la información más importante para detener el error de IU anterior que he mencionado.Aquí está mi explicación:
Ambas
getViewTypeCount()
ygetItemViewType()
están siendo utilizadas porBaseAdapter
elgetView
método de '' para averiguar qué tipo de vista debería ser recuperada, reciclada y devuelta. (como se explica en la respuesta superior dentro del hilo). Pero si no implementa estos dos métodos intuitivamente de acuerdo con el API de Android Doc, entonces podría meterse en el problema que mencioné.Directriz resumida para la implementación:
para implementar varios tipos de filas
Views
forListView
, tenemos que implementar esencialmente métodosgetItemViewType()
ygetViewTypeCount()
métodos. Y lagetItemViewType()
documentación nos da una Nota de la siguiente manera:Por lo tanto, en su
getItemViewType()
debe devolver los valores para el Tipo de vista, comenzando desde 0, hasta el último tipo como (número de tipos - 1). Por ejemplo, supongamos que solo tiene tres tipos de vistas. Entonces, dependiendo del objeto de datos para la vista, solo puede devolver 0 o 1 o 2 delgetItemViewType()
método, como un índice de matriz basado en cero. Y como tiene tres tipos de vistas utilizadas, sugetViewTypeCount()
método 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 podría experimentar el error de interfaz de usuario anterior que acaba de colocar al no obedecer al Android API Doc.
Si no obtuvo la pista o aún no pudo resolverlo y necesita más información, lea mi respuesta detallada en este hilo de preguntas y respuestas de StackOverflow .
Lea el documento de desarrollador de Android para obtener más información, puede encontrar la pista directamente.
Espero que esta respuesta pueda ser útil para que alguien ahorre muchas horas.
¡¡¡Salud!!!
fuente
IGNORE_ITEM_VIEW_TYPE
que tuve un error en uno de mis ListView. Usé un ArrayAdapter para insertar una vista compuesta de 1 imagen y 2 vistas de texto. Solo tenía un tipo de vista. Intenté no anular el método getItemViewType o anularlo devolviendo la posición o un entero codificado. En todos los casos, estaba experimentando duplicados en mi lista, con un comportamiento extraño al desplazarme (cambios duplicados). Al volverIGNORE_ITEM_VIEW_TYPE
al método, se solucionó el problema. Gracias.