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

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

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

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

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

Ответы [ 17 ]

1 голос
/ 06 августа 2013

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

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

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

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

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

1 голос
/ 18 декабря 2015

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

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 голос
/ 28 марта 2017

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

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

}

1 голос
/ 07 февраля 2010

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

0 голосов
/ 11 апреля 2012

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

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

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

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

0 голосов
/ 31 января 2016

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

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