Actualización del primer elemento gridview después de que getView lo infla dos veces

Estoy creando una vista de cuadrícula de "documentos" siguiendo el patrón de soporte de vista / adaptador. En la actividad obtengo callbacks de las clases de red, así que necesito poder actualizar cada una de las celdas de la cuadrícula en diferentes momentos.

La forma en que estoy haciendo esto es por tener un mapa de mapeo desde el elemento del objeto (documento) a la titular de la vista correspondiente. Tengo que hacer esto porque el adaptador está reciclando las células así que a veces podría recibir una devolución de llamada para actualizar una célula que no es visible en cuyo caso la información de la devolución de llamada sería ignorada.

Puedo ver que el método getView del adaptador se está llamando muchas veces de esta manera para la posición 0. He estado leyendo que esto es normal sin embargo.

 inflating position 0 *** progressBar 1 recycling position 0 recycling position 0 inflating position 0 *** progressBar 2 recycling position 0 recycling position 0 recycling position 0 recycling position 0 recycling position 0 recycling position 0 

Uno de los elementos de la UI de UI que necesito actualizar desde las devoluciones de llamada es una barra de progreso que mantengo al agregar el viewHolder a mi mapa asociado con el documento.

Todo este enfoque funciona bien para todas las posiciones excepto para la primera. La única diferencia que podía identificar era estas llamadas múltiples a getView así que comencé a depurar de allí. El progressBar que estoy actualizando es " progressBar 2", que es el último que geView inflado pero en realidad no responde a la setVisible (View.VISIBLE). Luego hice algunos cambios en el código para actualizar " progressBar 1" y funciona.

Esto significa que getView está inflando dos veces la misma posición, pero la segunda vez no se está utilizando o se muestra.

¿Qué podría estar haciendo mal? ¿Por qué progressbar1 funciona mientras que progressbar2 no? Yo esperaría que getView me daría la última vista correspondiente a una posición.

Gracias.

Adaptador:

 public class DocumentPickerGridViewAdapter extends ArrayAdapter<Document> implements Filterable { private final DocumentPickerGridViewController picker; private ArrayList values; private ArrayList filtered; private LayoutInflater inflater; public DocumentPickerGridViewAdapter(Context context, ArrayList values) { super(context, R.id.documentPickerGridView, values); this.picker = (DocumentPickerGridViewController) context; this.filtered = values; this.values = (ArrayList)values.clone(); inflater = (LayoutInflater) picker.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder oldHolder; ViewHolder holder; Document doc = (Document) filtered.get(position); if (v == null) { v = inflater.inflate(R.layout.documentpickergriditem, parent, false); holder = new ViewHolder(); holder.actionView = (Button) v.findViewById(R.id.document_action_button); holder.coverView = (ImageView) v.findViewById(R.id.documentCoverImage); holder.archiveButton = (Button) v.findViewById(R.id.document_archive_button); holder.progressView = (ProgressView) v.findViewById(R.id.documentProgress); holder.progressBar = (ProgressBar) v.findViewById(R.id.documentCoverImageProgressBar); picker.allProgressViews.add(holder); Log.d("MARIANO","adding to allProgressViews "+holder.progressView); Log.d("MARIANO","inflating position "+position); v.setTag(holder); } else{ // here we are recycling, we should clean old stuff. holder = (ViewHolder)v.getTag(); synchronized (picker){ oldHolder = picker.documentHoldersMap.get(holder.doc); } if(oldHolder != null){ oldHolder.progressView.setVisibility(View.GONE); oldHolder.progressBar.setVisibility(View.GONE); } // Document associated with previous holder it's now out of the adapter visible window. // we have to remove it from the map so if picker receives any call back we won't update anything. if(! holder.doc.uuid().equals(doc)){ synchronized (picker){ picker.documentHoldersMap.remove(holder.doc); } } } holder.doc = doc; holder.position = position; synchronized (picker){ picker.documentHoldersMap.put(doc,holder); } /* TODO: check why view extendedGrid starts to measure the size of the grid after gridpicker view has disapear. This causes a ArrayOutofIndexes exception. DocumentGridPicker view does setDocuments(null); which clears all arrays, but the adapter stays setting as many cells as before. https://kaldorgroup.jira.com/browse/NEWSWEEK-49 */ if(picker.documents() != null && picker.documents().size() > 0 ){ picker.setCoverView(holder.coverView, doc); picker.setActionButton(holder.actionView, doc); picker.setArchiveButton(holder.archiveButton, doc); picker.refreshButton(doc); } TextView textView = (TextView) v.findViewById(R.id.documentName); textView.setText(doc.name()); if(position == 0) Log.d("MARIANO", "progressView: "+holder.progressView); return v; } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults result = new FilterResults(); if (constraint.equals(DocumentPickerGridViewController.FILTER_DOWNLOADED)) { ArrayList items = new ArrayList(); synchronized (this) { items.addAll(values); } for (int i = items.size() - 1; i >= 0; i--) { if (((Document) items.get(i)).state() != DocumentStates.Downloaded) items.remove(i); } result.count = items.size(); result.values = items; } else { // ALL ITEMS synchronized (this) { result.count = values.size(); result.values = values; } } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { filtered = (ArrayList)results.values; DocumentPickerGridViewAdapter.this.notifyDataSetChanged(); clear(); for(int i = 0, l = filtered.size(); i < l; i++) add((Document)filtered.get(i)); notifyDataSetInvalidated(); } }; } static class ViewHolder{ ImageView coverView; Button actionView; Button archiveButton; ProgressView progressView; ProgressBar progressBar; int position; Document doc; } } 

Vista en cuadrícula :

 <com.kaldorgroup.newsweek.ExpandableGridView android:id="@+id/documentPickerGridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:columnWidth="150dp" android:numColumns="auto_fit" android:horizontalSpacing="25dp" android:stretchMode="spacingWidth" android:verticalSpacing="20dp" android:layout_marginTop="10dp" android:layout_marginBottom="5dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:isScrollContainer="false" android:paddingTop="350dp" /> 

He enfrentado exactamente el mismo problema en GridView. Al hacer clic en el primer elemento de la lista, no se está actualizando. Acabo de cambiar el código de

  public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (convertView == null) { LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.calendar_item, null); } ....... } to public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; // if (convertView == null) // { LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.calendar_item, null); // } ....... } It is working fine to me.. But I don't have idea how it happens... Any Clarification on this will be more helpful!! 
  • Cómo inflar una vista en una posición determinada?
  • Cambiar el valor del texto en el diseño de inflar
  • Inflar una vista en un subproceso de fondo
  • Usar vista para inflar varias veces
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.