在Android上更改ListView项目的背景颜色

时间:2010-02-07 18:26:18

标签: android listview colors

如何基于每个项目更改ListView项目的背景颜色。当我在android:backgroundColor项目布局中使用ListView时,我可以实现此目的,但列表选择器不再可见。通过将drawSelectorOnTop设置为true,我可以再次显示选择器,但选择器会覆盖整个项目。

如何更改这些背景颜色并保留选择器?

PS我宁愿不改变选择器本身。

编辑:GMail应用程序的作者已经成功实现了这一点,所以它绝对是可能的。

18 个答案:

答案 0 :(得分:36)

您必须为要使用的每种颜色创建不同的状态drawable。

例如:list_selector_read.xmllist_selector_unread.xml

您需要做的就是将所有内容设置为透明,但android:state_window_focused="false"项除外。

然后,当您绘制列表时,每行都会调用setBackgroundResource(R.drawable.list_selector_unread/read)

您根本不在ListView上设置listSelector。这将维护您特定风格的Android的默认选择器。

答案 1 :(得分:26)

这是基于上述代码的修改,最简单的代码:

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;                

}

我希望你觉得它很有用

问候!

答案 2 :(得分:23)

好的,我让它像这样工作:

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

答案 3 :(得分:11)

似乎没有人提供任何使用适配器这样做的例子,所以我想我会发布我的代码片段来显示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;
    }
});

对于我来说,当列表项的外观需要动态更改时,这一直是一种有用的方法。

答案 4 :(得分:8)

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

 }

答案 5 :(得分:7)

最简单的方法就是这样。在ListArrayAdapter中只需执行此操作

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

不要过于复杂

答案 6 :(得分:7)

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

没什么可说的......

答案 7 :(得分:5)

更改项目布局中所有内容的简单代码(自定义列表视图扩展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);



        }
    });

答案 8 :(得分:4)

您是否要在点击自定义列表项时更改自定义列表项的背景颜色?

如果是这样的话:

您只需将以下代码添加到xml中的listview布局中。


  

机器人:drawSelectorOnTop = “真”   机器人:listSelector = “@机器人:可拉伸/ list_selector_background”


此处的列表选择器使用深灰色的默认选择器。 您可以创建自己的drawable并将其分配给列表选择器,如上所述。

希望这是你想要的。

答案 9 :(得分:2)

在正在运行的

中非常慢
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");
            }

答案 10 :(得分:1)

看看List14 example。在getView()中,您可以为每个条目调用convertView.setBackgroundDrawable()。例如,你可以有一个类成员计数器来决定调用它的背景以获得交替的背景。

答案 11 :(得分:1)

在列表视图中,您可以添加 android:listselector =你想要的颜色名称。

这项工作在我的应用中很好。

答案 12 :(得分:1)

可以找到关于此的最佳教程here

关键部分:

  1. 肯定在view.setSelected(true)中致电onItemClick,否则您无法看到所选的项目背景
  2. 保留选择器中的状态顺序,否则您会看到背景颜色不可预测的行为(state_selected后跟state_pressed

答案 13 :(得分:1)

通过更改Francisco Cabezas的代码,我得到以下内容:

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;

答案 14 :(得分:1)

你可以这样做。

SELECT TOP (1) WITH TIES LID, COUNT(*) AS TotalNumCommitte
FROM Commits
WHERE DateCommitted BETWEEN '2015-11-03' AND '2017-01-09'
GROUP BY LID
ORDER BY COUNT(*);

}

答案 15 :(得分:0)

如果为onItemClick事件添加了setBackgroundColor,除非您可以在点击事件之后添加它,否则它将无效。

尝试在适配器的getView方法中添加调试代码,您会发现每当您单击屏幕时都会再次调用getView。因此,在设置背景颜色后,系统将使用原始设置重绘屏幕。不知道为什么它会在点击时浪费资源重建屏幕,我们可以通过其他方式通知系统在需要时重绘屏幕。

也许您可以添加一些控制标志来确定单个行的背景颜色,然后修改getView方法以根据此控制标志设置颜色。因此,重绘屏幕时将更改背景颜色。

我也在寻找官方解决方案。

答案 16 :(得分:0)

我尝试了上面的所有答案..没有对我有用..这最终起作用并在我的应用程序中使用..它将提供读/未读列表项颜色,同时保持两种状态的listselector样式:

#app/assets/javascripts/application.js
//= require ckeditor/init

selectable_item_background_general.xml:

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

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

notification_list_itemlayout.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#12000000" />
</shape>

最后,在你的适配器中:

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

答案 17 :(得分:0)

这就是我使用的(Kotlin):

if(blablabla == "whatever") {
    view.setBackgroundColor(getColor(context, R.color.teal_200))
} else {
    view.setBackgroundColor(getColor(context, R.color.teal_700))
}