73 votes

Changer la couleur de fond des éléments ListView sur Android

Comment puis-je changer la couleur de fond de l' ListView éléments par élément de base. Lorsque j'utilise android:backgroundColor dans la ListView de l'élément de mise en page, je peux réaliser ceci, cependant la liste du sélecteur n'est plus visible. Je peux faire le sélecteur de nouveau visible en définissant drawSelectorOnTop de vrai, mais ensuite le sélecteur se superpose à l'ensemble de l'élément.

Toutes les idées sur la façon de changer les couleurs de fond et de garder le sélecteur?

PS je préfère ne pas changer le sélecteur de lui-même.

EDIT: les Auteurs de l'application GMail ont réussi à obtenir exactement ce il est donc certainement possible.

37voto

Hawkee Points 1341

Romainguy a la bonne réponse, mais c'était un peu claire pour moi donc je vais vous expliquer exactement ce qui doit être fait.

Vous devez créer un état différent de l'état drawable pour chaque couleur que vous souhaitez utiliser.

Par exemple: list_selector_read.xml et list_selector_unread.xml.

Tout ce que vous devez faire est de mettre tout en transparence à l'exception de l' android:state_window_focused="false" élément.

Puis, quand vous êtes le dessin de votre liste vous appelez setBackgroundResource(R.drawable.list_selector_unread/read) pour chaque ligne.

Vous n'avez pas défini une listSelector sur la liste. Pour maintenir le sélecteur par défaut pour votre saveur particulière de Android.

28voto

Francisco Cabezas Points 151

Ceci est une modification basée sur le code ci-dessus, un code le plus simple:

 private static int save = -1;

public void onListItemClick(ListView parent, View v, int position, long id) { 

    parent.getChildAt(position).setBackgroundColor(Color.BLUE);

    if (save != -1 && save != position){
        parent.getChildAt(save).setBackgroundColor(Color.BLACK);
    }

    save = position;                

}
 

J'espère que tu trouves cela utile

salutations!

25voto

Romain Guy Points 57114

PS je préférerais ne pas changer le sélecteur lui-même.

Si vous ne voulez pas faire cela (pourquoi ??), vous devez créer un état pouvant être dessiné comme arrière-plan de vos éléments de liste. Dans l'état "sélectionné", définissez le dessin sur transparent (@null ou # 00000000). De cette façon, lorsqu'un élément est sélectionné, le sélecteur s'affichera.

23voto

Adam Points 220

Ok, je dois le faire fonctionner comme ça:

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false" android:drawable="@color/BackgroundColor" />
    <item android:drawable="@color/transparent" />
</selector>
 

YMMV!

11voto

ubzack Points 1214

Personne ne semblait fournir de tels exemples uniquement à l'aide d'un adaptateur. J'ai donc pensé envoyer mon extrait de code pour afficher ListViews où l'élément "curSelected" a un arrière-plan différent:

 final ListView lv = (ListView)findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter()
{
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            convertView = new TextView(ListHighlightTestActivity.this);
            convertView.setPadding(10, 10, 10, 10);
            ((TextView)convertView).setTextColor(Color.WHITE);
        }

        convertView.setBackgroundColor((position == curSelected) ? 
            Color.argb(0x80, 0x20, 0xa0, 0x40) : Color.argb(0, 0, 0, 0));
        ((TextView)convertView).setText((String)getItem(position));

        return convertView;
    }

    public long getItemId(int position)
    {
        return position;
    }

    public Object getItem(int position)
    {
        return "item " + position;
    }

    public int getCount()
    {
        return 20;
    }
});
 

Cela a toujours été une approche utile pour moi lorsque l'apparence des éléments de liste doit changer de manière dynamique.

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