Android:禁用ListView点击时的高亮效果

310

我想禁用在触摸listView行时出现的橙色高亮。到目前为止,在我的xml中,我尝试了以下方法:

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

更多信息:我希望当用户触摸此listView对象时,没有任何差异。

15个回答

686
将此代码添加到您的 XML 文件中:
android:listSelector="@android:color/transparent"

对于这个问题,可能会有解决方案(我不确定,也不知道是否有更好的解决方案):

您可以将ColorStateList应用于TextView。


2
如果透明度设置仍然让选择区域变暗,可能它并没有完全透明。尝试使用#00000000代替,这是完全不可见的。 - Ridcully
43
在Java代码中,你可以使用listView.setSelector(android.R.color.transparent);来设置ListView的选择器颜色为透明。 - sulai
这应该是被接受的答案。它实际上用代码回答了问题,而不是给出修复的参考资料。 - Dylan Vander Berg
从Mushtaq的答案中,如果没有使用android:cacheColorHint="@android:color/transparent",我无法让它正常工作。 - Machado
我在PreferenceActivity中尝试了所有方法,但都没有起作用。有人可以帮帮我吗?总是得到那个橙色选择器真的很让人沮丧。 - lacas
显示剩余7条评论

190

RoflcoptrException的回答应该可以解决问题,但由于某些原因它对我没有起作用,所以我发布了对我有用的解决方案,希望能帮到其他人。

<ListView 
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
/>

101

橙色高亮效果是ListView的一个样式这篇文章提供了如何重写listView样式的好概述。

基本上,您拥有一个选择器,根据当前状态指定不同的样式元素。

请查看此链接以获取简短快速的解决方案。


这个方法能让我为每个listView对象设置不同的样式吗?另外,是否有可能避免我在Sebi的回答中提出的问题? - John Moffitt
1
是的,您可以覆盖任何样式属性。您可以使用第一个链接中描述的style="@style/MyStyle"属性为每个ListView专门分配样式。 - Cheryl Simon
很抱歉,但这不应该是答案。更改“listSelector”应该就可以了。 - Ayman Salah

63

来自ListView:禁用焦点高亮

当您设置ListAdapter时,请使用以下代码:

ListAdapter adapter = new SimpleCursorAdapter(MyList, Layout, c, 
                new String[] { "Name", "Score" }, to) 
{ 
    public boolean areAllItemsEnabled() 
    { 
        return false; 
    } 
    public boolean isEnabled(int position) 
    { 
        return false; 
    } 
}; 

这将覆盖BaseAdapter类。它还取消了单元格之间的白色边框。


4
无效,这将禁用项目的选择行为(OnItemClicked不会触发)。 - Sandor
6
这是一个好的解决方案,因为列表项是否高亮更多是行为问题而不是美学问题。因此,您可以将其用于不希望具有可选属性的列表视图上。全局样式并没有太大意义,因为您最终会想要一个选择的列表视图,并且对我来说,使用样式来控制行为似乎是错误的。它们不应该具有语义意义,只有审美意义。选择性属性是一个语义化的东西。 - Thomas Dignan
除此之外,覆盖isEnabled以禁用项目并不是禁用它的正确方法!文档说明isEnabled应该确定一个项目是否为分隔符,而非禁用它。 - Bakhshi

39

希望你也将这个添加到你的XML中,与listselector一起使用。希望它能够起作用。

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 

2
非常感谢。我想解决的问题是在滚动时整个listView都会被高亮显示(在我的情况下是白色)。这只发生在Android 2.3之前。现在已经解决了。 - Yeung
"#00000000" 和 "@android:color/transparent" 是一种多样化的类型吗? - Androider
@Androider,2011年我告诉人们它可以双向工作...今天你肯定不需要#000000。 - sheetal

31

如果您正在使用 ArrayAdapterBaseAdapter 来填充列表项,请 覆盖 isEnabled 方法并返回 false

 @Override
  public boolean isEnabled (int position) {
    return false;
  }

13

通过一些谷歌搜索以及在虚拟和真实设备上的测试,我注意到下面的代码可以工作:

ArrayAdapter<String> myList = new ArrayAdapter<String>(this, R.layout.list_item, strText) {
    public boolean isEnabled(int position) 
    { 
            return false; 
    } 
};

请注意,我省略了areAllItemsEnabled()部分。


这对我有用。然而,这是否意味着如果行的可禁用状态有可绘制对象,它也会更改它们的图像?是否可能禁用点击但不更改可绘制对象? - android developer
1
这会产生副作用,导致 ListView 不显示分隔线。 - Maciej Pigulski

11

我只有这个能帮到我:

transparent_drawable.xml

<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>

layout.xml:

android:listSelector="@drawable/transparent_drawable"

7
在代码中
listView.setSelector(getResources().getDrawable(R.drawable.transparent));

并将小透明图像添加到drawable文件夹中。
例如:transparent.xml
<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>

6

对于我而言,android:focusableInTouchMode="true" 是正确的方式。 android:listSelector="@android:color/transparent" 没有用处。请注意,我正在使用一个自定义listview,在每一行中包含多个对象。


是的, android:focusableInTouchMode="true" 允许视图响应触摸,因此(据我测试)它的背景生效,而不是listView的 listSelector。如果其背景为默认透明,则不会绘制任何内容。当我们使一个视图可点击时,它也变得 focusableInTouchMode,这就是为什么可点击视图从可能的选择器中获取其背景并进行绘制,如 android:background="@drawable/list_selector_highlight" - arberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接