如何基于每个项目更改ListView
项目的背景颜色。当我在android:backgroundColor
项目布局中使用ListView
时,我可以实现此目的,但列表选择器不再可见。通过将drawSelectorOnTop
设置为true,我可以再次显示选择器,但选择器会覆盖整个项目。
如何更改这些背景颜色并保留选择器?
PS我宁愿不改变选择器本身。
编辑:GMail应用程序的作者已经成功实现了这一点,所以它绝对是可能的。答案 0 :(得分:36)
您必须为要使用的每种颜色创建不同的状态drawable。
例如:list_selector_read.xml
和list_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。
关键部分:
view.setSelected(true)
中致电onItemClick
,否则您无法看到所选的项目背景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))
}