2011-06-16 1 views
0

J'ai une liste personnalisée et j'utilise un adaptateur de liste personnalisé pour afficher cette liste. Dans mon adaptateur de liste personnalisé, j'essaie de définir la couleur de chaque élément de manière dynamique en fonction d'une valeur dans l'objet. Cependant, chaque fois que j'essaie de faire cela, les éléments deviennent fanés plutôt que d'obtenir la couleur à laquelle ils étaient fixés. J'applique quelques styles au projet mais quand j'enlève leur effet ça ne marche toujours pas. Ceci est mon code pour changer la couleur de fond de chaque élément:Pourquoi ne puis-je pas définir dynamiquement l'arrière-plan de mon élément ListView personnalisé?

private class stationAdapter extends ArrayAdapter<Station>{ 
    private ArrayList<Station> stations; 

    public stationAdapter(Context context, int textViewResourceId, ArrayList<Station> stations) { 
     super(context, textViewResourceId, stations); 
     this.stations = stations; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.row, null); 
     } 
     Station temp = stations.get(position); 
     if (temp != null) { 
      TextView stationName = (TextView) v.findViewById(R.id.stationname); 
      TextView serviced = (TextView) v.findViewById(R.id.inservice); 

      try{ 
       if(temp.getLine().equals("red")){ 
        v.setBackgroundColor(R.color.red); 

       } 
       else{ 
        v.setBackgroundColor(R.color.green); 
       } 
      }catch(Exception e){ 
       Log.d(TAG, "Null pointer"); 
      } 
      if (stationName != null) { 
       stationName.setText("Station: "+temp.getName());       } 
      if(serviced != null){ 
       serviced.setText("In Service: "+ temp.getInServive()); 
      } 
     } 
     return v; 
    } 

} 

Si quelqu'un pouvait indiquer ce que je fais mal, je voudrais vraiment l'apprécier.

Répondre

2

Comme Darko mentionné, vous essayez de définir une couleur, mais en utilisant un ID de ressource à la place. Cela dit, en utilisant une couleur unie pour un fond d'élément de liste est un grand non-non, vous voulez certainement utiliser un sélecteur:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="false" android:state_pressed="false" android:state_selected="false" 
     android:state_checked="false" android:state_enabled="true" android:state_checkable="false" 
     android:drawable="@color/red" /> 
</selector> 

Mettez ça dans un list_red_background.xml dans votre dossier dessinables et utiliser setBackgroundResource() à la place.

+0

Donc, utilisez ce dessin pour définir la couleur et cela va également régler mon nouveau problème de mise en évidence? Merci – Hugs

+0

Ouais, cela va le réparer. Ce que ce sélecteur dit est: appliquez seulement la couleur rouge sur l'état par défaut (non pressé, non sélectionné, etc.), pour tout le reste, utilisez les couleurs/drawables par défaut. – dmon

3

Vous ne pouvez pas utiliser setBackgroundColor puis faire référence à une ressource. si vous voulez utiliser setBackgroundColor(), vous devez utiliser la classe de couleur comme:

setBackgroundColor(Color.BLACK); 

Au lieu de cela, si vous souhaitez définir une ressource (R.drawable, R.color etc ...), vous devez le faire comme

v.setBackgroundResource(R.color.black); 

EDIT:

l'indice de couleur de cache est ce qui est nécessaire si les éléments commencent à devenir gris tout en faisant défiler la liste. Vous devez définir une couleur transparente si vous ajoutez des arrière-plans personnalisés à des éléments et à des listes.

+0

Fonctionne parfaitement grâce :) – Hugs

+0

marquer comme répondu alors pls afin que les gens sachent que c'est résolu. – DArkO

+0

Encore une question si cela ne vous dérange pas. J'avais un drawable qui chaque fois qu'un article était concentré la mise en évidence d'élément serait bleue. Mais rien n'est plus mis en évidence. La façon dont j'ai fait cela était dans ma classe row.xml et j'ai fait . Y a-t-il un autre moyen de le faire maintenant? Merci – Hugs

Questions connexes