¿Alguien en palabras simples me puede explicar el uso de los métodos getViewTypeCount()
y getItemViewType()
de ArrayAdapter
?métodos getViewTypeCount y getItemViewType de ArrayAdapter
Respuesta
Éstos manejan el caso en el que 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, se debería utilizar:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
El marco utiliza el tipo de vista para decidir que considera a mano que a través de convertView
en su getView
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 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 por defecto para todos los adaptadores:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
De hecho, esto le proporciona la misma tipo de vista para cada fila.
Editar - para delinear el flujo general:
- Enlaza datos a su
AdapterView
utilizando un adaptador. - El
AdapterView
intenta mostrar los elementos que son visibles para el usuario. - El marco llama a
getItemViewType
para la filan
, la fila que está por mostrar. - El marco verifica su grupo de vistas recicladas para las vistas del tipo de fila
n
. No encuentra ninguno porque aún no se han reciclado las vistas. getView
se llama para la filan
.- Llamar 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 completa la vista con información.
- Devuelve la vista, saliendo de
getView
, y la vista de su fila se muestra al usuario.
Ahora, cuando una vista se recicla desplazándose de la pantalla, entra en un grupo de vistas recicladas que está gestionado por el marco. Estas son esencialmente organizados por tipo de vista de manera que se da una visión del tipo correcto para usted en convertView
parámetro en el método getView
:
- El marco pide de nuevo
getItemViewType
para la fila que desea visualizar. - Esta vez, hay una vista en el grupo reciclado del tipo apropiado.
- La vista reciclada se le pasa como el parámetro
convertView
al métodogetView
. - Rellenas la vista reciclada con nueva información y la devuelves.
Si tenemos que mostrar diferentes tipos de vista en vista de lista a continuación, es bueno utilizar getViewTypeCount()
y getItemViewType()
adaptador en lugar de alternar una vista View.GONE
y View.VISIBLE
puede ser una tarea muy cara interior getView()
lo que afectará a la lista de desplazamiento .
Compruebe este para el uso de getViewTypeCount()
y getItemViewType()
en el adaptador.
Enlace: the-use-of-getviewtypecount
reloj Outttt !!!!
Tuve que enfrentarme a un problema al implementar un ListView
ayer y sus dos tipos de vistas se enredaron justo después de que lo desplacé. 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í es mi explicación:
Tanto getViewTypeCount()
y getItemViewType()
están siendo utilizados por BaseAdapter
's getView
método para saber qué tipo de objeto que se debe buscar, reciclada y devuelta. (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é.
Resumido de Directrices para la aplicación:
implementar varios tipos de Views
para ListView
's filas que tenemos que aplicar esencialmente, getItemViewType()
y getViewTypeCount()
métodos. Y getItemViewType()
documentación nos da una nota de la siguiente manera:
Nota: enteros deben estar en el rango
0
-getViewTypeCount() - 1
.IGNORE_ITEM_VIEW_TYPE
también se pueden devolver.
Así que en su getItemViewType()
debe devolver valores para el tipo de vista, empezando desde 0, hasta el último tipo que (número de tipos - 1). Por ejemplo, supongamos que solo tiene tres tipos de vistas. Por lo tanto, dependiendo del objeto de datos para la vista, solo puede devolver o o del método getItemViewType()
, como un índice de matriz basado en cero. Y cuando usted tiene tres tipos de vistas utilizadas, su método de getViewTypeCount()
debe devolver 3.
En cualquier caso, si regresa cualesquiera otros valores enteros como 1, 2, 3 ó 111, 222, 333 para este método que sin duda podría experimenta el error de UI anterior que acabas de colocar al no obedecer al Android API Doc.
Si no ha tenido la idea o si aún no puede resolver y necesita más información, lea mi detailed answer within this StackOverflow Q&A thread.
Lea el Android Developer Doc para obtener más información, puede encontrar la pista directamente.
Espero que esta respuesta le pueda ser útil a alguien para ahorrar un montón de horas !!!
¡Salud!
Gracias por mencionar 'IGNORE_ITEM_VIEW_TYPE' Tuve un error en uno de mis ListView. Usé un ArrayAdapter para insertar una vista compuesta de 1 imagen y 2 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 (duplica los cambios). Devolver 'IGNORE_ITEM_VIEW_TYPE' en el método solucionó el problema. Gracias. – Alex
@Alex contenta de que fue útil para usted! :-) –
- 1. ArrayAdapter y ListView - ArrayIndexOutOfBoundsException
- 2. Listview's ArrayAdapter notifydatasetchanged() muy lento redraw
- 3. Elija entre ArrayAdapter y SimpleAdapter
- 4. Explicación del método getView() de un ArrayAdapter
- 5. (Unidad) Prueba de ArrayAdapter
- 6. Usando ArrayAdapter con AlertDialog y .setAdapter
- 7. Dynamic AutocompleteTextView con ArrayAdapter y TextWatcher
- 8. Diferencia entre ArrayAdapter y ListAdapter en Android?
- 9. actualizar datos en ArrayAdapter
- 10. Anulando Android ArrayAdapter
- 11. artículos ArrayAdapter androide actualizar
- 12. Ordenando ArrayAdapter para Android
- 13. Filter ListView con arrayadapter
- 14. Android: cómo eliminar un elemento de una listaView y arrayAdapter
- 15. Cuando getView() en ArrayAdapter se llama
- 16. Custom ArrayAdapter setPrincipal en getView
- 17. Práctica recomendada: actualice ArrayAdapter continuamente
- 18. Custom ArrayAdapter en un ListFragment
- 19. Filtrado personalizado ArrayAdapter en ListView
- 20. Android getSystemService dentro ArrayAdapter encargo
- 21. ListView con ArrayAdapter y ViewHolder agregando iconos al elemento incorrecto
- 22. Cuál es la diferencia entre ArrayAdapter, BaseAdapter y ListAdapter
- 23. Obtener todos los elementos de un ArrayAdapter
- 24. Bloqueos de actividad en setAdapter (ArrayAdapter);
- 25. ListView: setItemChecked solo funciona con ArrayAdapter estándar - NO funciona cuando se usa ArrayAdapter personalizado.
- 26. CursorAdapter vs ArrayAdapter para un ListView
- 27. ¿Cómo funciona el método ArrayAdapter getView()?
- 28. fuente personalizada para textview en ArrayAdapter
- 29. onItemClickListener no se activa en ArrayAdapter personalizado
- 30. ¿Cómo puedo configurar onClickListener en ArrayAdapter?
@Matthew, gracias por su respuesta. ¿Puede describir el flujo de cómo se invocan estos métodos? Además, no entiendo cómo esto está realmente asociado con mis datos en res/layout. – Eugene
No existe un contrato explícito para cuando se invocan estos métodos. res/layout es el lugar para ** ver ** objetos. Este es un ** adaptador **. Debe verificar el tipo de elemento en su método getView e inflar la vista correcta desde res/layout en consecuencia. –
Lo está devolviendo usted mismo en getItemViewType. –