9
votes

Mes images changent lors de défilement à ListView Android

Dans la semaine dernière, j'essaie juste de résoudre ce problème. Voir toutes les questions similaires et je ne sais pas pourquoi, les solutions ne fonctionnent pas pour moi. J'ai une vue de liste et chaque élément a une vue d'image. Lorsque cliqué sur la vue Image, je veux modifier la ressource d'image. bien. terminé. Mais lorsque le défilement, les ressources d'image changent. Mon code complet est: xxx

}

où j'ai une erreur?


0 commentaires

5 Réponses :


2
votes

Ceci est parce que lorsque vous Scroll ListView System Android Créez toujours une nouvelle ligne et détruisez des lignes non visibles. Vous devez modifier GeveView () comme ci-dessous, tout ira bien:

@Override
public View getView(int position, View view, ViewGroup parent) {
    View vi = view;
    final ViewHolder holder ;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

SharedPreferences sp  = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    if(view==null){

        vi = inflater.inflate(R.layout.customlistitem,null);
        holder = new ViewHolder();
        holder.titr = (TextView) vi.findViewById(R.id.listtext);
        holder.image = (ImageView) vi.findViewById(R.id.listimg);
        holder.image.setTag(position);
        vi.setTag(holder);
    }
    else{
        holder = (ViewHolder) vi.getTag();
    }


    holder.titr.setText(items.get(position));
if(sp.getBoolean("position="+position, false)){
    v.setBackgroundResource(R.drawable.fav_ic);
}
    holder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           v.setBackgroundResource(R.drawable.fav_ic);

SharedPreferences.Editor edit = sp.edit();
edit.putBoolean("position="+position, true);
edit.commit();

        }
    });
    return vi;
}


0 commentaires

6
votes

Vous devez utiliser une valeur booléenne dans le titulaire pour vérifier si votre image d'arrière-plan est définie ou non pour une rangée particulière.

titulaire xxx < P> jeu image xxx

espère que cela aidera.


0 commentaires

1
votes

Vous devez définir layoutinflater dans le constructeur car GeveView () Appelez chaque ligne afin que vous définissez layoutinflater dans GeView () puis layoutinflater définir à nouveau et encore pour chaque ligne.


0 commentaires

2
votes

Essayez ceci, xxx pré>

Ajouter Classe de modèle: P>

public class Items {


    int drawableImage;
    String strTxt;


  public Items(int drawableImage) {
    this.drawableImage = drawableImage;
   }
    public int getDrawableImage() {
        return drawableImage;
    }

    public void setDrawableImage(int drawableImage) {
        this.drawableImage = drawableImage;
    }

    public String getStrTxt() {
        return strTxt;
    }

    public void setStrTxt(String strTxt) {
        this.strTxt = strTxt;
    }
}


2 commentaires

Ce code a fière allure. mais en ligne: 'items.set (position) .SetDrawableImage (R.Drawable.fav_ic);' devrait changer les articles.get ()


Merci. votre code est correct. Mon problème est résolu.



1
votes

Oui, ce problème apparaît toujours dans listview car Android détruisent et recrée des lignes de recrée.

Vous avez deux choix:

première , modifiez votre adaptateur pour enregistrer l'état pour chaque ligne de la liste et vérifiez cet état avant d'afficher la ligne.

second Un, j'ai recommandé celui-ci et utilisez-le dans mon code, vous pouvez utiliser recyclerview , ce problème n'arrivera pas avec elle.


0 commentaires