22

如何按选定的列表项执行此操作。

我尝试将其添加到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_width="fill_parent"
    android:layout_height="fill_parent" android:layout_below="@+id/round"
    android:listSelector="@drawable/listview_background">
</ListView>

问题是 black_alpha 将应用整个列表,而不仅仅是选定的列表项

4

5 回答 5

21

这是一篇关于如何将选择器与列表一起使用的好文章。

而不是将它设置为android:backgroundListView 的,我相信你想要设置android:listSelector如下所示:

<ListView android:id="@+id/list" 
      android:layout_width="fill_parent"
      android:layout_height="wrap_content" 
      android:layout_gravity="center"
      android:divider="@null" 
      android:dividerHeight="0dip"
      android:listSelector="@drawable/list_selector" />
于 2010-01-31T04:34:15.737 回答
8

贾克斯,你说过:

问题是 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_width="fill_parent"
android:layout_height="wrap_content"
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_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="8dip"
    android:src="@drawable/list_item_arrow" />
 <TextView
android:id="@+id/simple_list_item_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textSize="12sp"
android:textColor="@color/list_label_color"/>
</LinearLayout>
于 2010-10-20T17:16:47.753 回答
3

我也遇到了你的问题,颜色变化适用于整个列表。

但现在它现在对我有用:

我的主页包含列表视图(注意我没有在这里应用列表选择器):

 <ListView 
    android:id="@+id/controlList" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

而是将 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>

这就是上面代码的作用:第一次加载时的所有条目都是浅绿色的。使用光标上下滚动突出显示所选条目橙色。按下一行会将其变为深绿色。

于 2011-03-25T09:33:12.110 回答
2

正如评论中提到的大石头,一个可行的解决方案是使用形状而不是颜色(我也让整个列表突出显示)。这是一个完整的解决方案:

将这 2 个属性添加到列表视图中:

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>

现在列表项应该在按下状态下显示一个半透明的绿色覆盖。

于 2012-11-15T12:50:03.803 回答
0

我遇到了同样的问题,然后我只需要在我的项目视图 xml 中添加一个简单的行。

    android:background="?android:attr/activatedBackgroundIndicator"

检查这篇文章:这篇文章可能会有所帮助

于 2013-08-03T21:26:35.543 回答