Изменение цвета фона элементов ListView на Android - PullRequest
70 голосов
/ 07 февраля 2010

Как изменить цвет фона ListView элементов для каждого элемента. Когда я использую android:backgroundColor в макете элемента ListView, я могу добиться этого, однако селектор списка больше не отображается. Я могу снова сделать селектор видимым, установив для drawSelectorOnTop значение true, но затем селектор накладывает весь элемент на весь.

Есть идеи, как изменить эти цвета фона и сохранить селектор?

PS Я бы предпочел не менять сам селектор.

РЕДАКТИРОВАТЬ: авторам приложения GMail удалось добиться именно этого, так что это определенно возможно.

Ответы [ 17 ]

36 голосов
/ 12 октября 2010

Вы должны создать различное состояние для каждого цвета, который хотите использовать.

Например: list_selector_read.xml и list_selector_unread.xml.

Все, что вам нужно сделать, это установить все прозрачным, кроме пункта android:state_window_focused="false".

Затем, когда вы рисуете свой список, вы вызываете setBackgroundResource(R.drawable.list_selector_unread/read) для каждой строки.

Вы вообще не устанавливаете listSelector в ListView. Это будет поддерживать селектор по умолчанию для вашего конкретного вида Android.

26 голосов
/ 04 октября 2011

Это модификация, основанная на приведенном выше коде, простейший код:

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;                

}

Надеюсь, вы найдете это полезным

привет! * * 1006

23 голосов
/ 14 октября 2010

Хорошо, я заставил это работать так:

<?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!

11 голосов
/ 12 ноября 2011

Похоже, никто не привел никаких примеров того, как это делается исключительно с помощью адаптера, поэтому я подумал, что опубликую свой фрагмент кода для отображения ListView, где у элемента "curSelected" другой фон:

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;
    }
});

Это всегда было полезным для меня, когда внешний вид элементов списка должен динамически меняться.

7 голосов
/ 25 июля 2012

Из исходного кода Android's 2.2 Приложение электронной почты:

<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>

Больше нечего сказать ...

7 голосов
/ 13 февраля 2012

самый простой способ это. Внутри ListArrayAdapter просто сделайте это

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

не усложняйте

7 голосов
/ 27 октября 2010
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);
     }

 }
5 голосов
/ 23 января 2013

Простой код для изменения всего в макете элемента (пользовательский просмотр списка расширяет базовый адаптер):

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);



        }
    });
4 голосов
/ 17 июля 2012

Вы хотели изменить цвет фона пользовательских элементов списка при нажатии на него?

Если так:

Вы просто добавляете следующий код в макет списка в xml.


андроид: drawSelectorOnTop = "истина" андроид: listSelector = "@ андроид: рисуем / list_selector_background"


Селектор списка здесь использует селектор по умолчанию, который имеет темно-серый цвет. Вы можете сделать свой собственный рисунок и назначить его селектору списка, как указано выше.

Надеюсь, это то, что вы хотели.

2 голосов
/ 12 августа 2011

Следуя очень медленно в беге

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);
     }

 }

Заменено следующим

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");
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...