将 ListView 中的选择从橙色更改为绿色
Posted
技术标签:
【中文标题】将 ListView 中的选择从橙色更改为绿色【英文标题】:Change Selection in a ListView from Orange to Green 【发布时间】:2011-01-11 08:21:56 【问题描述】:如何为每个选定的列表项执行此操作。
我尝试将此添加到android:background
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
android:state_pressed="false"
android:drawable="@color/android_green" />
<item android:state_focused="true"
android:state_pressed="true"
android:drawable="@color/black_alpha" />
<item android:state_focused="false"
android:state_pressed="true"
android:drawable="@color/black_alpha" />
<item android:drawable="@color/white_alpha" />
</selector>
但它不起作用,它改变了整个 ListView。
还是不行,这就是我目前所拥有的
::listview_background
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@color/black_alpha" />
<item android:drawable="@color/white_alpha" />
</selector>
::我使用上面的观点
<ListView android:id="@+id/list" android:layout_
android:layout_ android:layout_below="@+id/round"
android:listSelector="@drawable/listview_background">
</ListView>
问题是 black_alpha 将应用整个列表,而不仅仅是选定的列表项
【问题讨论】:
本站http://android-codes-examples.blogspot.com/2011/03/customized-listview-items-selection.html提供了相同的解决方案,但提供了完整的源代码,这里清楚地提到了在列表视图中将xml作为背景提供的位置,以便我们轻松掌握它 【参考方案1】:这里有一个good article,介绍如何将选择器与列表一起使用。
不要设置成ListView的android:background
,相信你想设置android:listSelector
如下图:
<ListView android:id="@+id/list"
android:layout_
android:layout_
android:layout_gravity="center"
android:divider="@null"
android:dividerHeight="0dip"
android:listSelector="@drawable/list_selector" />
【讨论】:
我认为它不起作用,因为我使用的是@color而不是@drawable 这是“正确”的解决方案。 “标准” android 背景可以在文件夹 android-sdk\platforms\android-14\data\res\drawable-mdpi search after list 中找到。 @jax:是的!我有一个这样的选择器集,但它正在绘制整个列表。我将每种颜色都更改为具有该颜色的形状,并且效果很好。但是我在 2.2 上看到过这个问题,但在 2.3 和 4.0 上没有看到,所以我猜他们纠正了这种行为。【参考方案2】:贾克斯,你说过:
问题是 black_alpha 将应用整个列表,而不仅仅是选定的列表项
我遇到了同样的问题。在玩了一段时间之后,我能够通过使用我想要的颜色的 3x3 png 图像而不是应用颜色来让它停止将颜色应用于整个列表。因此,出于某种奇怪的原因,如果您使用一种颜色,您会得到奇怪的背景行为,当您使用 png 时,它可以正常工作。 :S
所以这是绕过它的一种方法。
-----另一种方式----------
当我将 listView 选择器设置为没有类似这样的状态时,我发现了最好的结果:
res/drawable/list_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
</selector>
然后我处理列表项背景中的所有状态。不在选择器中。我发现我通过这种方式有更多的控制权。
res/color/list_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false"
android:state_pressed="false"
android:drawable="@color/list_item_black_translucent" />
<item android:state_pressed="true"
android:drawable="@color/light_green_accent_translucent" />
</selector>
那么这里是我的列表项:
res/layout/simple_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="horizontal"
android:paddingRight="45dip"
android:paddingBottom="2dip"
android:layout_gravity="center_vertical"
android:background="@color/list_item_bg">
<ImageView
android:id="@+id/arrow"
android:layout_
android:layout_
android:layout_marginRight="8dip"
android:src="@drawable/list_item_arrow" />
<TextView
android:id="@+id/simple_list_item_label"
android:layout_
android:layout_
android:gravity="center_vertical"
android:textSize="12sp"
android:textColor="@color/list_label_color"/>
</LinearLayout>
【讨论】:
只想补充一点,如果列表项有边距,您的“其他方式”也很有效,因为在整个列表上设置 listSelector 似乎会忽略任何项目边距。感谢您的提示! 但这总是会在背景中绘制选择器,这并不总是需要的。您可以为整个项目创建一个叠加层,但这不是最好的解决方案...【参考方案3】:我也遇到了您的问题,即颜色更改适用于整个列表。
但现在它现在对我有用:
我的主页包含列表视图(注意我没有在这里应用列表选择器):
<ListView
android:id="@+id/controlList" android:layout_ android:layout_/>
而是将 listselector 应用于 getView,就像告诉 特定行 (convertView) 在其状态发生变化时使用可绘制折叠的 listselector.xml,例如按下,专注...:
@Override
public View getView(int position, View convertView, ViewGroup parent)
ViewHolder viewHolder;
if(convertView == null)
LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.control_list, null);
viewHolder = new ViewHolder();
viewHolder.topText = (TextView) convertView.findViewById(R.id.toptext);
viewHolder.bottomText = (TextView) convertView.findViewById(R.id.bottomtext);
convertView.setTag(viewHolder);
else
viewHolder = (ViewHolder) convertView.getTag();
//each convertView will be assigned the listselector
convertView.setBackgroundResource(R.drawable.listselector);
viewHolder.topText.setText(testSchemes[position]);
//viewHolder.vText.setText(testDetails[position]);
return convertView;
最后是我的 listselector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false"
android:state_selected="false"
android:drawable="@color/lightgreen" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_pressed="true"
android:drawable="@color/darkgreen" />
<item android:state_selected="true" android:state_pressed="false"
android:drawable="@color/orange" />
</selector>
这就是上面代码的作用: 首次加载时的所有条目都是浅绿色的。 使用光标向上和向下滚动突出显示所选条目橙色。 按一行会将其变为深绿色。
【讨论】:
【参考方案4】:正如评论中提到的 bigstones,一个可行的解决方案是使用形状而不是颜色(我也让整个列表突出显示)。这是一个完整的解决方案:
将这两个属性添加到列表视图中:
android:drawSelectorOnTop="true"
android:listSelector="@drawable/my_list_selector"
将 my_list_selector.xml 添加到可绘制文件夹:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#77526F35"/>
</shape>
现在列表项应该在按下状态时显示一个半透明的绿色叠加层。
【讨论】:
不错 +1 这对我来说是最简单的解决方法。修复了我的 2.3 问题。可以只在列表视图上应用选择器 - 快乐时光【参考方案5】:我遇到了同样的问题,然后我只需要在我的项目视图 xml 中添加一个简单的行。
android:background="?android:attr/activatedBackgroundIndicator"
查看此帖子:This post 可能会有所帮助
【讨论】:
以上是关于将 ListView 中的选择从橙色更改为绿色的主要内容,如果未能解决你的问题,请参考以下文章
如何修改jQuery mobile子菜单中的关闭按钮以进行初始打开
html (脸书,绿色,橙色,影子红,橙色)选择一个CSS样式和工具按钮