2010-11-29 27 views
0

Je suis confus en changeant la couleur d'arrière-plan d'une ligne particulière dans une vue de liste, ci-dessous est le code que j'ai essayé. Différentes lignes sont mises en évidence lorsque je fais défiler la liste, je voudrais comprendre la raison derrière cela. La logique semble assez simple, mais les résultats sont imprévisibles. Comment suis-je censé accomplir ceci.Difficulté à modifier la couleur d'arrière-plan d'une ligne particulière dans une liste personnalisée Android

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.rows_for_layout, null); 
      holder = new ViewHolder(); 
      holder.name = (TextView)convertView.findViewById(R.id.name); 
      holder.rated=(ImageView)convertView.findViewById(R.id.rated); 
       convertView.setTag(holder); 
      }else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      //selected_position is the position where the list has to be highlighted 
      if(position==selected_position){ 
       holder.name.setText(elements.get(position).get("name")); 
      convertView.setBackgroundResource(R.drawable.highlight_this); 
      holder.rated.setBackgroundResource(R.drawable.star_image); 
      }else{ 
       holder.name.setText(elements.get(position).get("name")); 

      } 


     return convertView; 
    }//getView ![alt text][1] 
+0

ne vois aucun problème avec le code, lorsque vous modifiez/la mise à jour variable « selected_position »? –

+0

Je mets les valeurs pour la variable 'selected_position' dans la méthode onCreate(), pour référence s'il vous plaît vérifier cette URL pour le code complet http://pastebin.com/ki7q6Wy0 – ganesh

+0

, vous pouvez vérifier l'image à http: //i56.tinypic .com/10x7rsw.png – ganesh

Répondre

1

Votre autre instruction ne réinitialise pas la couleur d'arrière-plan à son original. La méthode getView peut recycler une vue qui figurait auparavant dans votre liste mais qui n'est plus visible. Si l'arrière-plan a été modifié, il s'agira toujours de la couleur d'arrière-plan à partir de sa création initiale, qui peut dépendre de votre état.

Ainsi, pour « reset » qui, ajoutez ce qui suit dans votre autre:

if(position==selected_position){ 
      holder.name.setText(elements.get(position).get("name")); 
     convertView.setBackgroundResource(R.drawable.highlight_this); 
     holder.rated.setBackgroundResource(R.drawable.star_image); 
     }else{ 
      holder.name.setText(elements.get(position).get("name")); 
      //Add this 
      convertView.setBackgroundResource(R.drawable.not_highlighted); 
     } 
+0

Mais encore, pourquoi travailleriez-vous de cette façon? J'utiliserais plutôt un sélecteur comme arrière-plan, avec un état sélectionné/non sélectionné/...? C'est beaucoup plus propre que l'approche actuelle. – eMich

+0

merci eMich pour votre réponse, mais j'ai un sélecteur de vue de liste déjà et c'est fait comme vous l'avez dit, celui-ci est à part, je dois juste mettre en évidence une seule ligne dans une liste pour montrer que celui-ci est spécial. ont restauré pour utiliser "R.drawable.highlight_this" pour la rangée spéciale et un dessin transparent pour le reste. – ganesh