web-dev-qa-db-fra.com

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

Comment puis-je changer la couleur de fond des articles ListView pour chaque article? Lorsque j'utilise Android:backgroundColor dans la disposition de l'article ListView, je peux y parvenir, mais le sélecteur de liste n'est plus visible. Je peux rendre le sélecteur à nouveau visible en définissant drawSelectorOnTop sur true, mais le sélecteur recouvre alors l'élément entier.

Des idées comment changer ces couleurs de fond et garder le sélecteur?

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

EDIT: Les auteurs d’applications GMail ont réussi à réaliser exactement cela, c’est donc tout à fait possible.

68
Marek Stój

Vous devez créer un état différent pouvant être dessiné pour chaque couleur que vous souhaitez utiliser. 

Par exemple: list_selector_read.xml et list_selector_unread.xml

Tout ce que vous avez à faire est de tout définir sur transparent, à l'exception de l'élément Android:state_window_focused="false"

Ensuite, lorsque vous dessinez votre liste, appelez setBackgroundResource(R.drawable.list_selector_unread/read) pour chaque ligne. 

Vous ne définissez pas du tout un listSelector sur ListView. Cela maintiendra le sélecteur par défaut pour votre saveur particulière d’Android.

36
Hawkee

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!

25

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!

23
Adam

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.

11
ubzack
mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);

for(int i=0; i<parent.getChildCount(); i++)
{
     if(i == position)
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLUE);
     }
     else
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLACK);
     }

 }
8
Mbolland

le moyen le plus simple est le suivant. Dans votre ListArrayAdapter, faites simplement ceci

if(your condition here) rowView.setBackgroundColor(Color.parseColor("#20FFFFFF"));

ne pas trop compliquer

7
OWADVL

Depuis le code source de Application Android 2.2 Email:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_window_focused="false" Android:state_selected="true"
        Android:drawable="@Android:color/transparent" />
    <item Android:state_selected="true"
        Android:drawable="@Android:color/transparent" />
    <item Android:state_pressed="true" Android:state_selected="false"
        Android:drawable="@Android:color/transparent" />
    <item Android:state_selected="false"
        Android:drawable="@color/message_item_read" />
</selector>

Rien d'autre à dire...

7
ThePCWizard

Code simple pour tout changer dans la présentation de l'élément (la liste de diffusion personnalisée étend le gestionnaire de base)

lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            RelativeLayout layout=(RelativeLayout) arg1.findViewById(R.id.rel_cell_left);
            layout.setBackgroundColor(Color.YELLOW);



        }
    });
5
Nguyễn Anh Quế

Vouliez-vous changer la couleur d'arrière-plan des éléments de liste personnalisés lorsque vous cliquez dessus?

Si c'est le cas:

Vous venez d'ajouter le code suivant à votre présentation listview en xml.


Android: drawSelectorOnTop = "true" Android: listSelector = "@ Android: drawable/list_selector_background"


Le sélecteur de liste utilise ici le sélecteur par défaut qui a une couleur gris foncé . Vous pouvez créer votre propre dessin et l'assigner au sélecteur de liste comme ci-dessus.

J'espère que c'est ce que tu voulais.

4
PrasadW

Suivre le chemin très lentement dans la course

mAgendaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//view.setBackgroundColor(Color.RED);

for(int i=0; i<parent.getChildCount(); i++)
{
     if(i == position)
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLUE);
     }
     else
     {
               parent.getChildAt(i).setBackgroundColor(Color.BLACK);
     }

 }

Remplacé par le suivant

int pos = 0;
int save = -1;
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
            //Always set the item clicked blue background
            view.setBackgroundColor(Color.BLUE);

            if (pos == 0) {
                if (save != -1) {
                    parent.getChildAt(save).setBackgroundColor(Color.BLACK);
                }
                save = position;
                pos++;
                Log.d("Pos = 0", "Running");

            } else {
                parent.getChildAt(save).setBackgroundColor(Color.BLACK);
                save = position;
                pos = 0;
                Log.d("Pos # 0", "Running");
            }
2
PrDoHung

Jetez un oeil à Exemple de la liste14 . Dans getView(), vous pouvez appeler convertView.setBackgroundDrawable() pour chaque entrée. Vous pouvez avoir un compteur de classe pour décider par.

1
Heikki Toivonen

Le meilleur tutoriel sur ceci peut être trouvé ici

Sections clés:

  1. Appelez sûrement view.setSelected(true) dans onItemClick, sinon vous ne pouvez pas voir l’arrière-plan de l’élément sélectionné
  2. Conservez l'ordre des états dans votre sélecteur, sinon vous verrez un comportement imprévisible dans les couleurs d'arrière-plan (state_selected suivi de state_pressed).
1
Mohsen Afshin

Dans la liste, vous pouvez ajouter Android: listselector = nom de la couleur souhaitée.

cela fonctionne bien dans mon application.

1
Shivani Khandelwal

En changeant le code de Francisco Cabezas, j'ai obtenu ce qui suit:

private int selectedRow = -1;

...

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    parent.getChildAt(position).setBackgroundResource(R.color.orange);
    if (selectedRow != -1 && selectedRow != position) {
        parent.getChildAt(selectedRow).setBackgroundResource(R.color.black);
    }
    selectedRow = position;
1
CoolMind

J'ai essayé toutes les réponses ci-dessus .. aucune n'a fonctionné pour moi .. c'est ce qui a finalement fonctionné et est utilisé dans mon application .. il fournira les couleurs des éléments de liste lus/non lus tout en conservant les styles de sélecteur de liste pour les deux états: 

<ListView
                Android:id="@+id/list"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:listSelector="@drawable/selectable_item_background_general"
                Android:drawSelectorOnTop="true"
                Android:fadingEdge="none"
                Android:scrollbarStyle="outsideOverlay"
                Android:choiceMode="singleChoice" />

selectable_item_background_general.xml:  

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:exitFadeDuration="@Android:integer/config_mediumAnimTime">
    <item Android:state_pressed="false" Android:state_focused="true" Android:drawable="@drawable/bg_item_selected_drawable" />
    <item Android:state_pressed="true" Android:drawable="@drawable/bg_item_selected_drawable" />
    <item Android:drawable="@Android:color/transparent" />
</selector>

bg_item_selected_drawable.xml:  

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#12000000" />
</shape>

notification_list_itemlayout.xml:  

<RelativeLayout 
            xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:id="@+id/rowItemContainer"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content">

    <RelativeLayout 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:padding="8dp"
        Android:paddingLeft="16dp"
        Android:paddingStart="16dp"
        Android:paddingRight="16dp"
        Android:paddingEnd="16dp">

            <ImageView
                Android:id="@+id/imgViewIcon"
                Android:layout_width="60dp"
                Android:layout_height="60dp"
                Android:src="@drawable/cura_logo_symbol_small"
                Android:layout_alignParentLeft="true"
                Android:layout_alignParentStart="true"
                Android:layout_marginRight="8dp"
                Android:layout_marginEnd="8dp" />
            <TextView
                Android:id="@+id/tvNotificationText"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignTop="@+id/imgViewIcon"
                Android:layout_toRightOf="@+id/imgViewIcon"
                Android:layout_toEndOf="@+id/imgViewIcon"
                Android:textSize="@dimen/subtitle"
                Android:textStyle="normal" />
            <TextView
                Android:id="@+id/tvNotificationTime"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="1dip"
                Android:layout_below="@+id/tvNotificationText"
                Android:layout_toRightOf="@+id/imgViewIcon"
                Android:layout_toEndOf="@+id/imgViewIcon"
                Android:textSize="@dimen/subtitle" />
        </RelativeLayout>
</RelativeLayout>

Enfin, dans votre adaptateur:  

if (!Model.Read)
    rowItemContainer.SetBackgroundColor (Android.Graphics.Color.ParseColor ("#FFFDD0")); // unread color
else
    rowItemContainer.SetBackgroundColor (Android.Graphics.Color.White); // read color
0
Mohammad Zekrallah

Tu peux le faire.

 final List<String> fruits_list = new ArrayList<String>(Arrays.asList(fruits));

    // Create an ArrayAdapter from List
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>
            (this, Android.R.layout.simple_list_item_1, fruits_list){
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            // Get the current item from ListView
            View view = super.getView(position,convertView,parent);
            if(position %2 == 1)
            {
                // Set a background color for ListView regular row/item
                view.setBackgroundColor(Color.parseColor("#FFB6B546"));
            }
            else
            {
                // Set the background color for alternate row/item
                view.setBackgroundColor(Color.parseColor("#FFCCCB4C"));
            }
            return view;
        }
    };

    // DataBind ListView with items from ArrayAdapter
    lv.setAdapter(arrayAdapter);
}

}

0
Fouziya Parveen

Si la setBackgroundColor est ajoutée pour l'événement onItemClick, cela ne fonctionnera que si vous pouvez le placer après l'événement click.

Essayez d’ajouter du code de débogage à la méthode getView de l’adaptateur. Vous constaterez que getView sera appelé à nouveau chaque fois que vous cliquez sur l’écran. Ainsi, après avoir défini la couleur d'arrière-plan, le système redessinera l'écran avec les paramètres d'origine. Je ne sais pas pourquoi gaspiller des ressources pour reconstruire l'écran chaque fois que vous cliquez dessus, vous avez déjà un autre moyen de demander au système de redessiner l'écran si nécessaire.

Vous pouvez éventuellement ajouter un indicateur de contrôle pour déterminer la couleur d'arrière-plan de chaque ligne, puis modifier la méthode getView pour définir la couleur en fonction de cet indicateur de contrôle. Ainsi, la couleur d'arrière-plan sera modifiée lors du redessinage de l'écran.

Je cherche aussi une solution officielle à ce sujet.

0
Super169