Изменение цвета фона элементов списка на Android

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

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

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

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

Solutions Collecting From Web of "Изменение цвета фона элементов списка на Android"

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

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

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

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

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

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

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

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

Привет!

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

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

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

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

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

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

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

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

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

Не надо усложнять

Простой код для изменения всего в макете элемента (пользовательский 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); } }); 

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

Если так:

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


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


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

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

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

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

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

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

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

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

Основные разделы:

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

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

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

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

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

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

 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; 

Я пробовал все ответы выше .. никто не работал для меня .. это то, что в конечном итоге сработало и используется в моем приложении .. он будет предоставлять цвета для чтения / непрочитанных элементов списка при сохранении стилей 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 

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

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

}