Estoy tratando de determinar la mejor manera de tener un único ListView que contenga diferentes diseños para cada fila. Sé cómo crear una fila personalizada + un adaptador de matriz personalizado para admitir una fila personalizada para toda la vista de lista, pero ¿cómo puedo implementar muchos estilos de fila diferentes en ListView?
android
listview
listviewitem
w.donahue
fuente
fuente
Respuestas:
Como sabe cuántos tipos de diseño tendría, es posible usar esos métodos.
getViewTypeCount()
- este método devuelve información sobre cuántos tipos de filas tiene en su listagetItemViewType(int position)
- devuelve información sobre el tipo de diseño que debe usar según la posiciónLuego infla el diseño solo si es nulo y determina el tipo usando
getItemViewType
.Mira este tutorial para más información.
Para lograr algunas optimizaciones en la estructura que ha descrito en el comentario, sugeriría:
ViewHolder
. Aumentaría la velocidad porque no tendrá que llamarfindViewById()
cada vez en elgetView
método. Ver List14 en demostraciones de API .Espero que eso te ayude. Si pudiera proporcionar algún código auxiliar XML con su estructura de datos e información sobre cómo exactamente desea asignarlo en fila, podría darle un asesoramiento más preciso. Por píxel
fuente
Ya sabes lo básico. Solo necesita obtener su adaptador personalizado para devolver un diseño / vista diferente en función de la información de fila / cursor que se proporciona.
A
ListView
puede admitir varios estilos de fila porque deriva de AdapterView :Si observa el Adaptador , verá métodos que explican el uso de vistas específicas de fila:
Los dos últimos métodos proporcionan la posición para que pueda usarla para determinar el tipo de vista que debe usar para esa fila .
Por supuesto, generalmente no usa AdapterView y Adapter directamente, sino que usa o deriva de una de sus subclases. Las subclases de Adapter pueden agregar funcionalidades adicionales que cambian la forma de obtener diseños personalizados para diferentes filas. Dado que la vista utilizada para una fila determinada es controlada por el adaptador, el truco consiste en hacer que el adaptador devuelva la vista deseada para una fila determinada. La forma de hacerlo varía según el adaptador específico.
Por ejemplo, para usar ArrayAdapter ,
getView()
para inflar, llenar y devolver la vista deseada para la posición dada. ElgetView()
método incluye una oportunidad de reutilizar vistas a través delconvertView
parámetro.Pero para usar derivados de CursorAdapter ,
newView()
para inflar, rellenar y devolver la vista deseada para el estado actual del cursor (es decir, la "fila" actual [también necesita anularbindView
para que el widget pueda reutilizar vistas]Sin embargo, para usar SimpleCursorAdapter ,
SimpleCursorAdapter.ViewBinder
con unsetViewValue()
método para inflar, llenar y devolver la vista deseada para una fila dada (estado actual del cursor) y la "columna" de datos. El método puede definir solo las vistas "especiales" y diferir el comportamiento estándar de SimpleCursorAdapter para los enlaces "normales".Busque los ejemplos / tutoriales específicos para el tipo de adaptador que termina usando.
fuente
BaseAdapter
. Derivar de BaseAdapter sería el más "flexible", pero sería el peor en la reutilización y madurez del código, ya que no aprovecha el conocimiento y la madurez ya puestos en los otros adaptadores.BaseAdapter
está allí para contextos no estándar donde los otros adaptadores no encajan.CursorAdapter
ySimpleCursorAdapter
.ArrayAdapter
, no importa qué diseño le dé al constructor, siempre que segetView()
infla y devuelva el tipo correcto de diseñogetViewTypeCount()
solo se activa una vez cada vez que llamaListView.setAdapter()
, no para cada unoAdapter.notifyDataSetChanged()
.Echa un vistazo al siguiente código.
Primero, creamos diseños personalizados. En este caso, cuatro tipos.
even.xml
odd.xml
white.xml
black.xml
Luego, creamos el elemento listview. En nuestro caso, con una cadena y un tipo.
Después de eso, creamos un titular de vista. Se recomienda encarecidamente porque el sistema operativo Android mantiene la referencia de diseño para reutilizar su elemento cuando desaparece y vuelve a aparecer en la pantalla. Si no utiliza este enfoque, cada vez que su elemento aparece en la pantalla, el sistema operativo Android creará uno nuevo y hará que su aplicación pierda memoria.
Finalmente, creamos nuestro adaptador personalizado anulando getViewTypeCount () y getItemViewType (int position).
Y nuestra actividad es algo como esto:
ahora cree una vista de lista dentro de mainactivity.xml como esta
fuente
En su adaptador de matriz personalizado, anula el método getView (), como presumiblemente está familiarizado. Luego, todo lo que tiene que hacer es usar una instrucción switch o una instrucción if para devolver una vista personalizada determinada, según el argumento de posición pasado al método getView. Android es inteligente en el sentido de que solo le dará un convertView del tipo apropiado para su posición / fila; no necesita verificar que sea del tipo correcto. Puede ayudar a Android con esto anulando los métodos getItemViewType () y getViewTypeCount () adecuadamente.
fuente
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 el desplazamiento de la lista.
Verifique este para el uso de getViewTypeCount () y getItemViewType () en Adapter.
Enlace: the-use-of-getviewtypecount
fuente
ListView estaba destinado a casos de uso simples, como la misma vista estática para todos los elementos de fila.
Como debe crear ViewHolders y hacer un uso significativo
getItemViewType()
y mostrar dinámicamente diferentes XML de diseño de elementos de fila, debe intentar hacerlo usando RecyclerView , que está disponible en Android API 22. Ofrece una mejor compatibilidad y estructura para múltiples tipos de vista.Consulte este tutorial sobre cómo usar RecyclerView para hacer lo que está buscando.
fuente