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.

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; } 

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 - ¿Cómo crear una vista de lista seleccionable?
  • Cómo configurar el mensaje cuando recibo una excepción
  • Cursor SQLLiteDataBase de Android que devuelve 0 filas
  • Unidad de prueba Java clase que carga la biblioteca nativa
  • Anular los colores del menú contextual en Android
  • Cómo ejecutar "callOnClick ()" para Android API 8?
  • Android: UnsatisfiedLinkError debido a la estructura de carpetas en "lib"?
  • Conversión de NV21 a RGB mediante OpenCV en Android
  • HashMap con valores débiles
  • Keytool genera huella digital SHA1 en lugar de MD5?
  • ¿Cómo obtener valor de LinkedHashMap basado en el índice no en la clave?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.