Как изменить цвет фона элементов ListView
по каждому элементу. Когда я использую android:backgroundColor
в макете ListView
, я могу это сделать, однако селектор списка больше не отображается. Я могу сделать селектор видимым снова, установив drawSelectorOnTop
в значение true, но затем селектор накладывает весь элемент.
Любые идеи о том, как изменить эти цвета фона и сохранить селектор?
PS Я бы предпочел не менять селектор.
EDIT: авторам приложения GMail удалось достичь именно этого, поэтому это определенно возможно.
Ответ 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);
}
}