3 votes

La première image de l'adaptateur est incorrecte

Pour une raison quelconque, ma première image s'affiche correctement, puis est remplacée par l'image d'un autre utilisateur. Avez-vous des idées ?

public View getView(int position, View convertView, ViewGroup parent) { 
        View vi=convertView; 
        ViewHolder holder;
        if( convertView == null ){
                vi = inflater.inflate(R.layout.feed_item, null);
                holder=new ViewHolder();
                holder.userImage = (ImageView) vi.findViewById(R.id.feed_userimage);
                vi.setTag(holder);
        } else {
                holder=(ViewHolder)vi.getTag();
        }
        if(user.has("image") && 
          user.getString("image") != null && 
          !user.getString("image").equals("null")) {
                holder.userImage.setTag(user.getString("image"));
                imageLoader.DisplayImage(user.getString("image"), act, holder.userImage,USER_IMAGE_SIZE);
        } else {
                holder.userImage.setImageDrawable(null);
        }

1voto

Fedor Points 29890

Essayez cette solution

if(user.has("image") && 
    user.getString("image") != null && 
    !user.getString("image").equals("null")) {
  holder.userImage.setTag(user.getString("image"));
  imageLoader.DisplayImage(user.getString("image"), act, holder.userImage,USER_IMAGE_SIZE);
} else {
   holder.userImage.setTag(null);//add this line
   holder.userImage.setImageDrawable(null);
}

1voto

Arnab Chakraborty Points 2847

Cela arrive parce que vous utilisez convertView . Le site convertView transmis à la getView est essentiellement un objet de vue que vous avez créé (en le gonflant) dans une méthode précédente getView (qui n'est plus nécessaire car il n'est plus visible, en raison du défilement).

Vous supposez qu'à chaque fois getView est appelée une nouvelle vue est créée, alors que vous utilisez en fait des vues précédemment créées. Le site convertView est passé en tant qu'optimisation afin de ne pas avoir à créer trop de vues lorsque seules quelques-unes sont visibles. Ainsi, le setTag écrase en fait les données d'une vue précédemment créée. tag .

Vous devriez reconsidérer la réécriture de votre code sans utiliser tags . Ou bien, vous pourriez toujours gonfler la vue, au lieu de ne la gonfler que lorsque la fonction convertView n'est pas null . Mais je ne recommanderais pas cette approche car pour une longue liste, cela signifierait trop de vues inutiles dans la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X