353 votos

Listview Android con diseño diferente para cada fila

Estoy tratando de determinar la mejor manera de tener una sola vista de lista contiene diferentes estilos filas. Sé cómo crear un adaptador fila personalizada arsenal personalizada para apoyar una fila de encargo para toda la vista de lista. Pero, ¿cómo puede un apoyo listview muchos diferentes estilos de fila?

413voto

Cristian Puntos 92147

Ya sabe usted cuántos tipos de diseño que tendría - es posible usar esos métodos.

getViewTypeCount() - este método devuelve la información de cuántos tipos de filas que tiene en su lista

getItemViewType(int position) - devuelve la información de que tipo de diseño se debe utilizar en función de la posición

Luego se infla el diseño sólo si es null, y determinar el tipo de uso getItemViewType.

Mira este tutorial para más información.

Para lograr algunas optimizaciones en la estructura que he descrito en el comentario yo sugeriría:

  • Almacenar vistas en objeto llamado ViewHolder. Sería aumentar la velocidad, porque usted no tiene que llamar a findViewById() cada vez en getView método. Ver List14 en la API de demos.
  • Crear un diseño genérico que se cumplen todas las combinaciones de propiedades y ocultar algunos elementos si la posición actual no lo tiene.

Espero que te ayude. Si usted puede proporcionar algunos XML talón con su estructura de datos y de la información exactamente cómo usted desea mapa en fila, yo sería capaz de darle más preciso aconsejar. Por píxel.

63voto

Bert F Puntos 27237

Sé cómo crear una fila personalizada + matriz personalizada adaptador para soporte de una fila personalizada para toda la vista de lista. Pero, ¿cómo puede un listview apoyo de muchos fila diferente estilos?

Usted ya sabe los fundamentos. Usted sólo necesita obtener su adaptador personalizado para devolver un diseño diferente/vista basado en la fila/cursor de la información proporcionada.

Un ListView admite múltiples fila estilos porque deriva de AdapterView:

Un AdapterView es una vista cuyos hijos se determinan mediante un Adaptador.

Si usted mira el Adaptador, podrás ver los métodos que cuenta para el uso de la fila-opiniones específicas:

abstract int getViewTypeCount()
// Returns the number of types of Views that will be created ...

abstract int getItemViewType(int position)
// Get the type of View that will be created ...

abstract View getView(int position, View convertView, ViewGroup parent)
// Get a View that displays the data ...

Los dos últimos métodos proporcionar la posición de modo que usted puede utilizar para determinar el tipo de vista que usted debe utilizar para esa fila.


Por supuesto, usted por lo general no uso AdapterView y el Adaptador directamente, sino utilizar o se derivan de una de sus subclases. Las subclases de la Adaptador puede añadir la funcionalidad de que el cambio de cómo obtener diseños personalizados para las diferentes filas. Desde el punto de vista utilizado para una fila determinada es impulsado por el adaptador, el truco es conseguir el adaptador para volver a la vista que desee para una fila determinada. Cómo hacer esto varía en función del adaptador específico.

Por ejemplo, el uso de ArrayAdapter,

  • anular getView() de inflar, rellenar y devolver la vista que desee para la posición dada. La getView() método incluye una oportunidad de reutilización de las vistas a través de la convertView parámetro.

Pero para el uso de derivados de CursorAdapter,

  • anular newView() de inflar, rellenar y devolver la vista deseada para el actual estado de cursor (es decir. la actual "fila") [también es necesario anular bindView para que el widget se puede reutilizar vistas]

Sin embargo, el uso de SimpleCursorAdapter,

  • definir un SimpleCursorAdapter.ViewBinder con un setViewValue() método de inflar, rellenar y devolver la vista deseada para una fila determinada (actual estado de cursor) y "datos de la columna". El método puede definir simplemente el "especial" opiniones y aplazar para SimpleCursorAdapter estándar de comportamiento para el "normal" de los enlaces.

Buscar los ejemplos específicos/tutoriales para el tipo de adaptador que terminan usando.

14voto

Jems Puntos 5975

En su conjunto personalizado adaptador, se reemplaza el getView() método, como presumiblemente familiarizado con. Entonces todo lo que tienes que hacer es utilizar una sentencia switch o una instrucción if para devolver una cierta Vista personalizada dependiendo de la posición de argumento que se pasa al método getView. Android es inteligente en el que sólo le dará un convertView del tipo adecuado para su posición/fila; no es necesario para comprobar que es del tipo correcto. Usted puede ayudar a Android con esta reemplazando el getItemViewType() y getViewTypeCount() métodos de forma adecuada.

4voto

kyogs Puntos 2147

Si necesitamos mostrar otro tipo de vista de lista la vista de su buen uso getViewTypeCount() y getItemViewType() en el adaptador en lugar de alternar una vista VIEW.GONE y VIEW.VISIBLE puede ser muy costosa tarea dentro de getView() que afectará a la lista de desplazamiento.

Por favor, compruebe esto en uno para uso de getViewTypeCount() y getItemViewType() en el Adaptador.

Enlace : el-uso-de-getviewtypecount

1voto

Devon Puntos 134

Si usted es chino, o puedes leer chino, aquí está un artículo de cómo implementar realmente getItemViewType (int posición) Utilizo su tutorial para terminar mi trabajo ...

在Android的Listview中显示多种视图

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X