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

Comment puis-je changer la couleur de fond de ListView articles sur une base par article. Lorsque j'utilise android:backgroundColor dans la disposition de l'article ListView , je peux y arriver, mais le sélecteur de liste n'est plus visible. Je peux rendre le sélecteur à nouveau visible en réglant drawSelectorOnTop sur true, mais ensuite le sélecteur superpose tout l'article.

des idées pour changer les couleurs de fond et garder le sélecteur?

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

EDIT: les auteurs de L'application GMail ont réussi à réaliser exactement cela donc c'est certainement possible.

68
demandé sur kiamlaluno 2010-02-07 21:26:17

17 réponses

vous devez créer un dessin d'état différent pour chaque couleur que vous voulez utiliser.

par exemple: list_selector_read.xml et list_selector_unread.xml .

Tout ce que vous devez faire est de tout mettre à transparent, sauf l'article android:state_window_focused="false" .

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

vous ne définissez pas de listSelector sur ListView. Pour maintenir la sélecteur par défaut pour votre saveur particulière D'Android.

36
répondu Hawkee 2015-11-30 19:02:39

il s'agit d'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 vous le trouverez utile

salutations!

25
répondu Francisco Cabezas 2011-10-04 15:05:03

Ok, je l'ai fait 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!

22
répondu Adam 2010-10-14 02:34:20

personne ne semblait fournir d'exemples de faire cela uniquement en utilisant un adaptateur, donc j'ai pensé que je voudrais poster mon code snippet pour afficher des 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 la liste doit changer dynamiquement.

11
répondu ubzack 2011-11-12 17:26:51
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
répondu Mbolland 2011-04-26 17:33:00

du code source de Android 2.2 Email App:

<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 de plus à dire...

7
répondu ThePCWizard 2015-04-30 17:59:04

la façon la plus simple est celle-ci. À l'intérieur de votre ListArrayAdapter faites juste ceci

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

ne pas trop compliquer

7
répondu OWADVL 2015-10-01 15:26:33

code Simple pour changer tout dans la disposition de l'article (listview personnalisé étend baseadapter):

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
répondu Nguyễn Anh Quế 2013-01-23 10:42:08

vouliez-vous changer la couleur de fond des listitems personnalisés lorsque vous cliquez dessus?

si oui:

il vous suffit d'ajouter le code suivant à votre mise en page listview en xml.


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


le sélecteur de liste utilise ici sélecteur par défaut qui dispose d'un gris foncé couleur. Vous pouvez faire votre propre dessinable et l'assigner au sélecteur de liste comme ci-dessus.

J'espère que c'est ce que vous vouliez.

4
répondu PrasadW 2012-07-17 14:56:37

suivre la voie 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 texte 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
répondu PrDoHung 2011-08-12 09:05:19

regardez List14 exemple . Dans getView() vous pouvez appeler convertView.setBackgroundDrawable() pour chaque entrée. Vous pouvez avoir un comptoir de membre de classe pour décider avec quel fond l'appeler pour obtenir des fonds alternatifs, par exemple.

1
répondu Heikki Toivonen 2010-02-07 19:54:44

Dans la vue liste, vous pouvez l'ajouter android: listselector=nom de couleur que vous voulez.

ce travail très bien dans mon application.

1
répondu Shivani Khandelwal 2013-01-23 05:14:53

le meilleur tutoriel sur ce peut être trouvé ici .

sections clés:

  1. appelez sûrement view.setSelected(true) dans onItemClick , sinon vous ne pouvez pas voir l'article sélectionné background
  2. préservez l'ordre des États dans votre sélecteur sinon vous verrez un comportement imprévisible dans les couleurs de fond ( state_selected suivi de state_pressed )
1
répondu Mohsen Afshin 2013-08-06 09:50:22

en changeant le code de Francisco Cabezas, j'ai eu le suivant:

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
répondu CoolMind 2015-12-18 17:04:47

si le setBackgroundColor est ajouté pour l'événement onItemClick, il ne fonctionnera pas à moins que vous ne le mettiez après l'événement click.

essayez d'ajouter le code de débogage dans la méthode getView de l'adaptateur, vous verrez que getView sera appelé de nouveau chaque fois que vous cliquez sur l'écran. Ainsi, après avoir réglé la couleur de fond, le système redessinera l'écran avec le réglage original. Je ne sais pas pourquoi il gaspille des ressources pour reconstruire l'écran chaque fois qu'il est cliqué, il y a déjà une autre façon que nous pouvons aviser le système de redessiner l'écran lorsque nécessaire.

peut-être que vous pouvez ajouter un drapeau de contrôle pour déterminer la couleur de fond pour une ligne individuelle, puis modifier la méthode getView pour définir la couleur en fonction de ce drapeau de contrôle. Ainsi, la couleur de fond sera changée quand il redessine l'écran.

je cherche aussi une solution officielle.

0
répondu Super169 2012-10-29 10:50:21

j'ai essayé toutes les réponses ci-dessus .. aucun n'a fonctionné pour moi .. c'est ce qui a finalement fonctionné et qui est utilisé dans mon application .. il fournira des couleurs d'éléments de liste en lecture/non lus tout en maintenant les styles listselector 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
répondu Mohammad Zekrallah 2016-01-31 11:06:48

vous pouvez 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
répondu Fouziya Parveen 2017-03-28 10:15:47