Android:在listView上禁用突出显示单击


302

我想禁用触摸listView行时出现的橙色突出显示。到目前为止,在我的xml中,我尝试了以下操作:

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

更多信息:我希望用户触摸此listView对象上的屏幕时,零差异。

Answers:


674

将此添加到您的xml:

android:listSelector="@android:color/transparent"

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

您可以将ColorStateList应用于TextView。


2
如果透明仍然使选择变暗一点,则可能不是完全透明。尝试使用#00000000,这是完全不可见的。
Ridcully 2012年

对我来说是完美的解决方案。我尝试为围绕布局的listviews的背景设置透明的选择器XML drawable,但这导致ICS设备上出现上述橙色条。
马库斯·鲁德尔

@RoflcoptrException我使用a Fragment作为列表。XML布局包含LinearLayout和多个TextView项目。请在哪里禁用行高亮显示?
JJD

40
通过Java Code,您可以listView.setSelector(android.R.color.transparent);
sulai 2012年

@RoflcoptrException->“您可以将ColorStateList应用于TextView”-如果列表行不可单击,则这是一个不错的选择。一旦单击textview,列表本身的onClick事件将不会触发。
塞巴斯蒂安·霍亚斯

189

RoflcoptrException的答案应该可以解决问题,但是由于某种原因它对我不起作用,因此,我正在发布对我有用的解决方案,希望它对某人有帮助

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

101

橙色突出显示效果是ListView上的一种样式本文对如何重写listView样式进行了很好的概述。

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

看到这个简短而快速的解决方案https://stackoverflow.com/a/12242564/185022


此方法是否允许我为每个listView对象使用不同的样式?另外,是否可以避免我在Sebi的回答中提到的问题?
约翰·莫菲特

1
是的,您可以覆盖任何样式属性。您可以使用样式=“ @ style / MyStyle”属性为每个ListView专门分配样式,如第一个链接中所述。
谢丽尔·西蒙

很抱歉,但这不是答案。改变listSelector应该的。
艾曼萨拉

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
这是一个很好的解决方案,因为列表视图项是否突出显示更多是行为问题,而不是美观问题。因此,您可以将其用于不希望具有selectable属性的列表视图。全局样式实际上没有任何意义,因为您知道最终将需要一个可以选择的列表视图,对我而言,使用样式进行行为似乎是错误的。它们不应具有语义,而应具有美学意义。选择性的属性是语义上的东西。
Thomas Dignan 2012年

除此之外,这不是此问题的答案,重写isEnabled禁用项不是禁用它的方法!文档说isEnabled应该确定项目是否为分隔符。
巴赫什

39

还将它与listselector ..一起添加到ur XMl中

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

2
非常感谢。我想解决滚动时突出显示整个listView(在我的情况下为白色)的问题(仅在Android 2.3之前发生)。而且有效。

“#00000000”和“ @android:color / transparent”的多样性?
Androider '16

@Androider ya在2011年,我让人们知道它可以双向工作...绝对今天你不需要#000000
活页

32

如果使用ArrayAdapterBaseAdapter填充列表项。OverrideisEnabled方法和回报false

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

13

在虚拟设备和真实设备上进行几次Google搜索和测试后,我注意到我的以下代码有效:

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

注意,我已经省略了该areAllItemsEnabled()部分。


这对我有用。但是,这是否表示如果具有处于禁用状态的行有一个可绘制对象,它也会更改其图像?是否可以禁用单击但不更改可绘制对象?
android开发人员

1
这有一个副作用,导致ListView不显示分隔线。
Maciej Pigulski 2014年

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

并将小的透明图像添加到可绘制文件夹中。

像:transparent.xml

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

5

对我来说android:focusableInTouchMode="true"是要走的路。android:listSelector="@android:color/transparent" 没有用。请注意,我使用的是自定义列表视图,每行中都有许多对象。


5

您只需要添加: android:cacheColorHint="@android:color/transparent"


5

作为备选:

listView.setSelector(android.R.color.transparent);

要么

listView.setSelector(new StateListDrawable());

1

有一种快速简便的方法可以执行此操作:在方法中:

private void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    //TODO
    ((ListView)sender).SelectedItem = null;
}

希望会有所帮助;)


这个C#不是Java
安东尼

我认为大多数android程序员仍在使用java,因为这是Android Studio支持的功能,但是可以使用C#。我只想澄清一下,这是C#:D
Anthony

0

如果要禁用单个列表视图项目的突出显示,但要保持该单元格处于启用状态,请设置该单元格的背景色以禁用突出显示。

例如,在您的单元格布局中,设置 android:background="@color/white"


0

您可以从中pos获取onItemClick 并执行以下操作:

listView.setItemChecked(pos, false);

那是我所知道的最好的方式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.