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

302

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

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

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

Джон Моффит
источник

Ответы:

674

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

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

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

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

RoflcoptrException
источник
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класс. Это также отменяет белую границу между ячейками.

emdog4
источник
4
Неверно, это отключило поведение выбора (OnItemClicked не сработает) для элемента
Сандор
6
Это хорошее решение, потому что выделение элемента списка является скорее поведенческой проблемой, чем эстетической. Таким образом, вы можете использовать это для списков, которые вы не хотите иметь свойство выбора. Глобальный стиль на самом деле не имеет смысла, так как вы знаете, что в конечном итоге вам понадобится список, который можно выбрать, и использование стилей для поведения мне кажется неправильным. Они не должны иметь смыслового значения, только эстетические. Свойство выбора - семантическая вещь.
Томас Диньян
Кроме того, это не ответ на этот вопрос, переопределение isEnabledотключения элемента не является способом его отключения! Документация говорит, что isEnabledпредполагается определить, является ли элемент разделителем.
Бахши
39

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

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 
Sheetal
источник
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()часть.

aerobrain
источник
это сработало для меня. однако, не означает ли это, что если для строк, имеющих состояние «отключено», существует свойство 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" бесполезно. Обратите внимание, что я использую пользовательский список с количеством объектов в каждой строке.

erdomester
источник
5

Вам нужно только добавить: android:cacheColorHint="@android:color/transparent"

Пракаш
источник
5

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

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

или

listView.setSelector(new StateListDrawable());
Natali
источник
1

Существует быстрый и простой способ сделать это: В методе:

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

Надеюсь, это поможет;)

FeldonDragon
источник
Это C # не Java
Энтони
Я думаю, что большинство программистов Android все еще используют Java, потому что это то, что поддерживает Android Studio, но C # может быть причиной. Я просто хочу уточнить, что это C #: D
Энтони
0

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

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

веселье
источник
0

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

listView.setItemChecked(pos, false);

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

Главный Мадог
источник