Android: отключение подсветки при нажатии на просмотр списка


302

Я хочу отключить оранжевую подсветку, которая появляется при касании строки listView. До сих пор в моем XML я пробовал следующее:

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

Более подробная информация: я хочу, чтобы разница была нулевой, когда пользователь касается экрана в этом объекте listView.

Ответы:


674

Добавьте это к вашему XML:

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

И для проблемы это может работать (я не уверен, и я не знаю, есть ли лучшие решения):

Вы можете применить ColorStateList к вашему TextView.


2
если прозрачность все еще немного затемняет выделение, возможно, она не определена как полностью прозрачная. Вместо этого попробуйте # 00000000, это совершенно невидимо.
Чудесно

Идеальное решение для меня. Я попытался установить прозрачный селектор XML, который можно нарисовать для фона списков, окружающих макет, но это привело к вышеупомянутой оранжевой полосе на устройствах ICS.
Маркус Рудель

@RoflcoptrException Я использую Fragmentдля списка. XML-макет содержит LinearLayoutнесколько TextViewэлементов. Где я должен отключить подсветку строки, пожалуйста?
JJD

40
Из Java Code вы можете сделатьlistView.setSelector(android.R.color.transparent);
sulai

@RoflcoptrException -> «Вы можете применить ColorStateList к вашему 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? Кроме того, возможно ли избежать вопроса, который я поднял в ответе Себи?
Джон Моффитт

1
Да, вы можете переопределить любые атрибуты стиля. Вы можете специально назначить стиль для каждого ListView, используя атрибут style = "@ style / MyStyle", как описано в первой ссылке.
Шерил Саймон

Извините, но это не должно быть ответом. Изменение 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 не сработает) для элемента
Сандор

6
Это хорошее решение, потому что выделение элемента списка является скорее поведенческой проблемой, чем эстетической. Таким образом, вы можете использовать это для списков, которые вы не хотите иметь свойство выбора. Глобальный стиль на самом деле не имеет смысла, так как вы знаете, что в конечном итоге вам понадобится список, который можно выбрать, и использование стилей для поведения мне кажется неправильным. Они не должны иметь смыслового значения, только эстетические. Свойство выбора - семантическая вещь.
Томас Диньян

Кроме того, это не ответ на этот вопрос, переопределение isEnabledотключения элемента не является способом его отключения! Документация говорит, что isEnabledпредполагается определить, является ли элемент разделителем.
Бахши

39

добавить это также к вашему XMl вместе с listselector .. надеюсь, это будет работать

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

2
Большое спасибо. Я хочу решить проблему, состоящую в том, что весь listView подсвечивается (белый цвет в моем случае) при прокрутке (происходит только до Android 2.3). И это работает.
Yeung

"# 00000000" и "@android: цвет / прозрачность" для разнообразия?
Androider

@ Androider ya в 2011 году я давал людям знать, что он работает в обе стороны ... Определенно, сегодня вам не понадобится # 000000
листовка

32

Если вы используете ArrayAdapterили BaseAdapterдля заполнения пунктов списка. метод и возврата .OverrideisEnabledfalse

 @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()часть.


это сработало для меня. однако, не означает ли это, что если для строк, имеющих состояние «отключено», существует свойство drawable, оно также изменит их изображение? Можно ли отключить нажатие и при этом не изменить рисование?
Android-разработчик

1
Это имеет побочный эффект, заставляющий ListView не показывать разделители.
Мацей Пигульски

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

Как альтернатива:

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
Энтони

0

Если вы хотите отключить выделение для отдельного элемента представления списка, но оставить ячейку включенной, установите цвет фона для этой ячейки, чтобы отключить выделение.

Например, в макете вашей ячейки установите android:background="@color/white"


0

вы можете просто получить то, posчто вы получаете от onItemClick и сделать:

listView.setItemChecked(pos, false);

это лучший способ, который я знаю

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.