Mise à jour du premier élément gridview après getView l'infine deux fois

Je crée une vue de grille des «documents» en suivant le modèle de support / adaptateur de vue. Dans l'activité, je reçois des rappels de classes réseau, donc je dois être en mesure de mettre à jour chacune des cellules du réseau à des moments différents.

La façon dont je le fais est de disposer d'un mappage Map depuis l'élément objet (document) vers le titulaire de vue correspondant. Je dois le faire parce que l'adaptateur est en train de recycler les cellules afin que parfois je puisse recevoir un rappel pour mettre à jour une cellule qui n'est pas visible, auquel cas les informations de rappel seront ignorées.

Je peux voir que la méthode getView de l'adaptateur est appelée plusieurs fois de cette façon pour la position 0. J'ai lu que c'est normal cependant.

 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 

L'un des éléments d' UI je dois être mis à jour à partir des rappels est une barre de progression que je surveille en ajoutant le viewHolder à ma carte associée au document.

Cette approche complète fonctionne bien pour tous les postes sauf pour le premier. La seule différence que j'ai pu identifier était ces appels multiples à getView alors j'ai commencé à déboguer à partir de là. Le progressBar que je met à jour est " progressBar 2" qui est le dernier que geView gonflé, mais en fait il ne répond pas à setVisible (View.VISIBLE). Ensuite, j'ai apporté des modifications au code pour mettre à jour " progressBar 1" et cela fonctionne.

Cela signifie que getView influe deux fois la même position, mais la deuxième fois n'est pas utilisée ou n'a pas été getView .

Qu'est-ce que je ferais mal? Pourquoi progressbar1 fonctionne-t-il alors que progressbar2 ne fonctionne pas? Je m'attends à ce que getView me donne la dernière vue correspondant à un poste.

Merci.

Adaptateur:

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

GridView:

 <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" /> 

One Solution collect form web for “Mise à jour du premier élément gridview après getView l'infine deux fois”

J'ai rencontré exactement le même problème dans GridView. Tout en cliquant sur le premier élément de la liste, il ne se rafraîchit pas. Je viens de changer le code 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!! 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.