Reutilización de vistas en Android Listview con 2 diseños diferentes
He aprendido que para maximizar la eficiencia con las vistas de lista de Android, sólo debe tener tantas vistas de filas infladas como se necesitan para caber en la pantalla. Una vez que una vista se ha desplazado de la pantalla, debe reutilizarla en su método getView
, comprobando si convertView
es nulo o no.
Sin embargo, ¿cómo puede implementar esta idea cuando necesite 2 diseños diferentes para la lista? Digamos que es una lista de órdenes y un diseño es para órdenes completadas y el otro diseño es para órdenes de proceso.
- Lectura de transacciones no confirmadas en Android
- Analizar archivo xml utilizando java para - aplicación basada en android
- ¿Cómo ver qué archivos no se han guardado en Android Studio?
- Cómo girar cuatro sprites al foco de estos sprites
- Problema de exactitud de Google maps
Este es un tutorial de ejemplo de la idea que mi código está usando. En mi caso, tendría dos diseños de fila: R.layout.listview_item_product_complete
y R.layout.listview_item_product_inprocess
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); if(getItemViewType(position) == COMPLETE_TYPE_INDEX) { convertView = mInflator.inflate(R.layout.listview_item_product_complete, null); holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_complete); holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_complete); } else { // must be INPROCESS_TYPE_INDEX convertView = mInflator.inflate(R.layout.listview_item_product_inprocess, null); holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_inprocess); holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_inprocess); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } thisOrder = (Order) myOrders.getOrderList().get(position); // If using different views for each type, use an if statement to test for type, like above holder.mNameTextView.setText(thisOrder.getNameValue()); holder.mImgImageView.setImageResource(thisOrder.getIconValue()); return convertView; } public static class ViewHolder { public TextView mNameTextView; public ImageView mImgImageView; }
- Implementación de paquetes parecidos a Spring en Android
- Eclipse SDK Manager no se muestra
- Cómo mostrar / ocultar elemento de barra de acciones mediante programación mediante Evento de clics
- Cómo a los botones de entrada de iluminación retroiluminada de forma programática?
- El adaptador de vista de lista no funciona, getView no se llama.
- Eclipse JUNO + ADT 23.0.2 Recursos $ NotFoundException
- La falta de Java de la herencia de la plantilla está causando dolores de cabeza principales de la duplicación del código en Android. ¿Alguna solución?
- ¿Cómo comprobar el nombre de dominio dado http o https en java?
Es necesario que el reciclador de la vista del adaptador sepa que hay más de un diseño y cómo distinguir entre los dos para cada fila. Simplemente anule estos métodos:
@Override public int getItemViewType(int position) { // Define a way to determine which layout to use, here it's just evens and odds. return position % 2; } @Override public int getViewTypeCount() { return 2; // Count of different layouts }
Incorporar getItemViewType()
dentro de getView()
, como esto:
if (convertView == null) { // You can move this line into your constructor, the inflater service won't change. mInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); if(getItemViewType(position) == 0) convertView = mInflater.inflate(R.layout.listview_item_product_complete, parent, false); else convertView = mInflater.inflate(R.layout.listview_item_product_inprocess, parent, false); // etc, etc...
Vea a Romain Guy de Android hablar de la recaudadora de vistas en Google Talks.
No hay necesidad de diseñar una solución a ti mismo solo sobreescribir getItemViewType () y getViewTypeCount ().
Vea la siguiente entrada del blog para un ejemplo http://sparetimedev.blogspot.co.uk/2012/10/recycling-of-views-with-heterogeneous.html
Como explica el blog, Android no garantiza que getView reciba el tipo de vista correcto.
- Android: No se puede realizar esta operación porque se ha cerrado el grupo de conexiones
- No puedo IntelliJ reconocer mi SDK de Android