Android: відключення виділення в спискуView click


302

Я хочу відключити помаранчеву підсвітку, яка виникає під час торкання рядка listView. Поки в своєму xml я спробував наступне:

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

Додаткова інформація: Я хочу, щоб різниця нуля була, коли користувач торкається екрана цього об'єкта listView.

Відповіді:


674

Додайте це у свій xml:

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

І для проблеми це може спрацювати (я не впевнений і не знаю, чи є кращі рішення):

Ви можете застосувати ColorStateList до TextView.


2
якщо прозорість все ще трохи затемнює виділення, можливо, він не визначений як повністю прозорий. Натомість спробуйте # 00000000, це абсолютно непомітно.
Ridcully

Ідеальне рішення для мене. Я спробував встановити прозорий селектор XML, який можна малювати для тла списків перегляду навколишнього макета, але це призводить до вищезазначеної оранжевої смуги на пристроях ICS.
Маркус Рудель

@RoflcoptrException Я використовую Fragmentдля списку. Макет XML містить a LinearLayoutі кілька TextViewелементів. Де я можу відключити виділення рядка, будь ласка?
JJD

40
З коду Java ви можете зробити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 не запустить) для елемента
Sandor

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
sheetal

32

Якщо ви використовуєте ArrayAdapterабо BaseAdapterзаповнюєте елементи списку. метод і повернення .OverrideisEnabledfalse

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

13

Після кількох "google'ing" та тестування на віртуальних та реальних пристроях, я помічаю, що мій код нижче працює:

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

зауважте, що я пропустив areAllItemsEnabled()порцію.


це працювало для мене. однак чи не означає це, що якщо для рядків, у яких є відключений стан, є креслення, воно також змінить їх зображення? чи можна вимкнути клацання, але все ж не змінити графік?
андроїд розробник

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 # not java
Ентоні

Я думаю, що більшість андроїд-програмістів досі використовують 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.