Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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;                

}

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

привет!

Ответ 3

Хорошо, я сделал так, чтобы он работал следующим образом:

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

Ответ 4

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

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

Ответ 5

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

 }

Ответ 6

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

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

не усложнять

Ответ 7

Из исходного кода приложения 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>

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

Ответ 8

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

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



        }
    });

Ответ 9

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

Если да:

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


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


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

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

Ответ 10

В очень медленном режиме в

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

Секции клавиш:

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

Ответ 14

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

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

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

Я также ищу официальное решение.

Ответ 15

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

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;

Ответ 16

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

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

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

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

Ответ 17

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

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

}