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

如何更改 ListView项目的每个项目的背景颜色。当我在 ListView项目布局中使用 android:backgroundColor时,我可以做到这一点,但是列表选择器不再可见。我可以通过将 drawSelectorOnTop设置为 true 使选择器再次可见,但是选择器覆盖了整个项。

有什么办法可以改变这些背景颜色,并保持选择器?

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

编辑: GMail 应用程序的作者已经设法做到了这一点,所以这是绝对可能的。

232851 次浏览

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

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

例如: list_selector_read.xmllist_selector_unread.xml

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

然后,当您绘制您的名单,您调用 setBackgroundResource(R.drawable.list_selector_unread/read)为每一行。

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

好吧,我是这么想的:

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

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


}

在跑步中非常缓慢地跟随着

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

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

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;


}

希望对你有用

你好!

似乎没有人提供单独使用适配器完成此操作的任何示例,因此我想我应该发布我的代码片段来显示 ListView,其中“ 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;
}
});

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

最简单的方法是在你的 ListArrayAdapter 中这样做

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

不要过于复杂

如果为 onItemClick 事件添加了 setBackgroundColor,则它将无法工作,除非您可以将其放在 click 事件之后。

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

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

我也在寻找一个正式的解决方案。

您是否打算在单击自定义列表时更改其背景颜色?

如果是:

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


= “ true” Android: listSelector = “@android: draable/list _ selector _ behind”


这里的列表选择器使用默认选择器,其颜色为深灰色。 您可以创建自己的绘图工具,并将其分配给列表选择器,如上所示。

希望这是你想要的。

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

没什么好说的了。

在列表视图中可以添加 所需的颜色名称。

这个在我的应用程序中工作得很好。

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






}
});

这方面最好的教程可以找到 给你

主要部分:

  1. 当然,在 onItemClick中调用 view.setSelected(true),否则您将无法看到所选项目的背景
  2. 在选择器中保持状态的顺序,否则您将看到背景颜色中不可预测的行为(state_selected后面跟着 state_pressed)

通过修改 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;

我试了上面所有的答案。.对我来说都不管用。.这是什么工作,最终,并在我的应用程序中使用。.它将提供已读/未读列表项的颜色,同时保持列表选择器样式:

<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 _ back _ 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 _ select _ draable.xml:

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

通知 _ 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);
}

}

这就是我所用的(科特林) :

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