2011-03-14 17 views

Respuesta

283

É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:

  1. Enlaza datos a su AdapterView utilizando un adaptador.
  2. El AdapterView intenta mostrar los elementos que son visibles para el usuario.
  3. El marco llama a getItemViewType para la fila n, la fila que está por mostrar.
  4. 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.
  5. getView se llama para la fila n.
  6. Llamar a getItemViewType para la fila n para determinar qué tipo de vista debe usar.
  7. Utiliza una instrucción if/switch para inflar un archivo xml diferente según el tipo de vista que se requiera.
  8. Usted completa la vista con información.
  9. 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:

  1. El marco pide de nuevo getItemViewType para la fila que desea visualizar.
  2. Esta vez, hay una vista en el grupo reciclado del tipo apropiado.
  3. La vista reciclada se le pasa como el parámetro convertView al método getView.
  4. Rellenas la vista reciclada con nueva información y la devuelves.
+1

@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

+0

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. –

+1

Lo está devolviendo usted mismo en getItemViewType. –

11

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

7

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!

+1

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

+0

@Alex contenta de que fue útil para usted! :-) –

Cuestiones relacionadas