it-swarm.com.ru

Изменение цвета фона элементов ListView на Android

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

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

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

Правка: Авторы приложения GMail удалось достичь именно этого, так что это определенно возможно.

68
Marek Stój

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

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

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

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

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

36
Hawkee

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

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;                

}

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

привет!

25
Francisco Cabezas

Хорошо, я получил его на работу так:

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

Казалось, никто не привел никаких примеров того, как делать это исключительно с помощью адаптера, поэтому я подумал, что опубликую свой фрагмент кода для отображения ListViews, где элемент «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;
    }
});

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

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

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

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

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

7
OWADVL

Из исходного кода 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
ThePCWizard

Простой код для изменения всего в макете элемента (настраиваемый просмотр списка расширяет 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
Nguyễn Anh Quế

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

Если так:

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


Android: drawSelectorOnTop = "истинный" Android: listSelector = "@ Android: рисуем/list_selector_background"


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

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

4
PrasadW

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

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");
            }
2
PrDoHung

Взгляните на список List14 . В getView() вы можете вызывать convertView.setBackgroundDrawable() для каждой записи. Вы могли бы иметь счетчик участника класса, чтобы решить, с каким фоном вызывать его, например, для получения чередующихся фонов.

1
Heikki Toivonen

Лучший учебник по этому вопросу можно найти здесь

Ключевые разделы:

  1. Обязательно вызовите view.setSelected(true) в onItemClick, иначе вы не увидите фон выбранного элемента
  2. Сохраните порядок состояний в вашем селекторе, иначе вы увидите непредсказуемое поведение в цветах фона (state_selected и state_pressed)
1
Mohsen Afshin

В виде списка вы можете добавить Android: listselector = имя цвета, которое вы хотите.

это отлично работает в моем приложении.

1
Shivani Khandelwal

Изменяя код Франциско Кабеса, я получил следующее:

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

Я перепробовал все ответы выше ... ни один из них не работал для меня ... это то, что в конечном итоге сработало и используется в моем приложении ... это обеспечит чтение/чтение непрочитанных элементов списка при сохранении стилей выбора списка для обоих состояний: 

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

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

Наконец, в вашем адаптере:  

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

Вы можете сделать это.

 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

Если setBackgroundColor добавлен для события onItemClick, он не будет работать, если вы не можете поместить его после события click.

Попробуйте добавить код отладки в метод адаптера getView, вы обнаружите, что getView будет вызываться снова всякий раз, когда вы нажимаете на экран. Итак, после того, как вы установите цвет фона, система перерисовает экран с исходными настройками. Не знаю, зачем тратить ресурсы на восстановление экрана всякий раз, когда на него щелкают, уже есть другой способ, которым мы можем уведомить систему о необходимости перерисовать экран при необходимости.

Возможно, вы можете добавить некоторый флаг элемента управления, чтобы определить цвет фона для отдельной строки, а затем изменить метод getView, чтобы установить цвет в соответствии с этим флагом элемента управления. Таким образом, цвет фона будет изменен при перерисовке экрана.

Я также ищу официальное решение по этому вопросу.

0
Super169