ListView avec ArrayAdapter et ViewHolder ajoutant des icônes au mauvais élément

J'ai un ListView dynamique qui utilise un ArrayAdapter . Lorsqu'un nom est sélectionné à partir d'un spinner, le nom avec une icône montrant si les hommes ou les femmes est ajouté à ListView .

Principalement tout est bon (le nom est ajouté à la liste correctement, avec une icône). Mais l'icône montrant le sexe est ajoutée au mauvais élément dans ListView . Le nom est ajouté au bas de la liste, mais l'icône est placée sur le nom en haut de la liste. Je ne sais pas si c'est la façon dont j'utilise ViewHolder mais il n'y a pas de documentation sur le site Android .

  • Modifier la couleur du texte en surbrillance dans Android
  • Android: tentative de sérialisation ... Ouais-tu enregistrer un adaptateur de type? "
  • Bouton d'accueil désactivé
  • Android SDK: Obtenez une image de prévisualisation sans prévisualisation sans l'afficher
  • Android Espresso Tests pour téléphone et tablette
  • La flèche vers le haut ne s'affiche pas après avoir appelé ActionBarDrawerToggle.setDrawerIndicatorEnabled (false)
  •  // Listview inflater inflater = (LayoutInflater) (this).getSystemService(LAYOUT_INFLATER_SERVICE); // List Array. mAdapter = new ArrayAdapter<String>(this, R.layout.player_simple_list, R.id.label, mStrings) { @Override public View getView(int position, View convertView, ViewGroup parent) { Log.i("ANDY","View getView Called"); // A ViewHolder keeps references to children views to // avoid unneccessary calls to findViewById() on each row. ViewHolder holder; if (null == convertView) { Log.i("ANDY","Position not previously used, so inflating"); convertView = inflater.inflate(R.layout.player_simple_list, null); // Creates a ViewHolder and store references to the // two children views we want to bind data to. holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.label); holder.icon = (ImageView) convertView.findViewById(R.id.icon); if (sexmale == true) { holder.icon.setImageBitmap(maleicon); } else { holder.icon.setImageBitmap(femaleicon); } convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. holder.text.setText(getItem(position)); // Change icon depending is the sexmale variable is true or false. Log.i("ANDY","getCount = "+mAdapter.getCount()); return convertView; } }; setListAdapter(mAdapter); 

  • Erreur de fin de la mémoire
  • Dialogue de progrès de conception de matériaux
  • Comment faire un zoom panoramique zoomable?
  • Le meilleur conteneur IOC pour les appareils Android / mobiles
  • Nouvelle API Facebook 3.0. Et la compatibilité ActionBarSherlock
  • RETROFIT & AUTH COOKIE
  • 3 Solutions collect form web for “ListView avec ArrayAdapter et ViewHolder ajoutant des icônes au mauvais élément”

    Vous devez définir les icônes après if-else-if pour créer ou lier un holder . Sinon, les icônes ne s'affichent correctement que dans les premiers éléments de la liste, c'est-à-dire jusqu'à ce que ListView ne soit pas rempli.

     public View getView(int position, View convertView, ViewGroup parent) { Log.i("ANDY","View getView Called"); // A ViewHolder keeps references to children views // to avoid unneccessary calls to findViewById() on each row. ViewHolder holder; if (null == convertView) { Log.i("ANDY","Position not previously used, so inflating"); convertView = inflater.inflate(R.layout.player_simple_list, null); // Creates a ViewHolder and store references to // the two children views we want to bind data to. holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.label); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. holder.text.setText(getItem(position)); // Change icon depending is the sexmale variable is true or false. if (sexmale == true) { holder.icon.setImageBitmap(maleicon); } else { holder.icon.setImageBitmap(femaleicon); } Log.i("ANDY","getCount = "+mAdapter.getCount()); return convertView; } 

    Mise à jour: ViewHolder est uniquement destiné à contenir des références aux vues des composants dans la mise en page de l'élément. Cela aide à éviter les frais généraux d'appeler findViewById pour rendre chaque composant à l'intérieur de configurations d'éléments complexes avec plusieurs composants (comme le TextView et ImageView dans ce cas).

    Je l'ai réparé en utilisant une routine (appelée getSex ) pour récupérer les données sexuelles et définir toutes les données de la vue, y compris les icônes en dehors des blocs if-else .

    Le code de travail ressemble maintenant à ceci:

     if (null == convertView) { Log.i("ANDY","Position not previously used, so inflating"); convertView = inflater.inflate(R.layout.player_simple_list, null); // Creates a ViewHolder and store references to the two children views // we want to bind data to. holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.label); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. holder.text.setText(getItem(position)); // Change icon depending is the sexmale variable is true or false. if (getSex (getItem(position)) == true) { holder.icon.setImageBitmap(maleicon); } else { holder.icon.setImageBitmap(femaleicon); } return convertView; 

    Vous devez vous déplacer à partir du si quelques lignes de données après le commentaire, comme dans cette question est expliqué

     // Bind the data efficiently with the holder. 

    Donc ça ressemblera à ça

     if (null == convertView) { Log.i("ANDY","Position not previously used, so inflating"); convertView = inflater.inflate(R.layout.player_simple_list, null); // Creates a ViewHolder and store references to the two children views // we want to bind data to. holder = new ViewHolder(); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. holder.text = (TextView) convertView.findViewById(R.id.label); holder.icon = (ImageView) convertView.findViewById(R.id.icon); if (sexmale == true) { holder.icon.setImageBitmap(maleicon); } else { holder.icon.setImageBitmap(femaleicon); } holder.text.setText(getItem(position)); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.