Android: wyłączanie podświetlenia na liście Kliknięcie widoku


302

Chcę wyłączyć pomarańczowe podświetlenie, które pojawia się po dotknięciu wiersza listView. Do tej pory w moim xml próbowałem:

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

Więcej informacji: Chcę, aby nie było żadnej różnicy, gdy użytkownik dotknie ekranu tego obiektu listView.

Odpowiedzi:


674

Dodaj to do swojego xml:

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

W przypadku problemu może to działać (nie jestem pewien i nie wiem, czy są lepsze rozwiązania):

Możesz zastosować ColorStateList do TextView .


2
jeśli przezroczyste nadal nieco przyciemnia zaznaczenie, być może nie jest zdefiniowane jako całkowicie przezroczyste. Spróbuj # 00000000 zamiast tego, jest to całkowicie niewidoczne.
Ridcully,

Idealne rozwiązanie dla mnie. Próbowałem ustawić przezroczysty selektor XML do rysowania jako tło widoków listy otaczających układ, ale to prowadziło do wspomnianego wyżej pomarańczowego paska na urządzeniach ICS.
Markus Rudel

@RoflcoptrException Używam Fragmentdla listy. Układ XML zawiera LinearLayouti wiele TextViewelementów. Gdzie powinienem wyłączyć podświetlenie wiersza?
JJD

40
Z kodu Java możesz to zrobićlistView.setSelector(android.R.color.transparent);
sulai

@RoflcoptrException -> „Możesz zastosować ColorStateList do TextView” - jest to dobra opcja, jeśli wiersze listy nie są klikalne. Po kliknięciu widoku tekstu zdarzenie onClick samej listy nie zostanie uruchomione.
Sebastian Hojas

189

Odpowiedź RoflcoptrException powinna załatwić sprawę, ale z jakiegoś powodu nie zadziałała dla mnie, więc zamieszczam rozwiązanie, które zadziałało dla mnie, mam nadzieję, że pomoże komuś

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

101

Pomarańczowy efekt podświetlenia jest stylem w ListView. Ten artykuł zawiera dobry przegląd sposobu zastąpienia stylu listView.

Zasadniczo masz selektor, który określa różne elementy stylu w zależności od bieżącego stanu.

zobacz to, aby znaleźć krótkie i szybkie rozwiązanie https://stackoverflow.com/a/12242564/185022


Czy ta metoda pozwoli mi mieć inny styl dla każdego obiektu listView? Czy można także uniknąć problemu, który poruszyłem w odpowiedzi Sebiego?
John Moffitt,

1
Tak, możesz zastąpić dowolne atrybuty stylu. Możesz specjalnie przypisać styl do każdego ListView za pomocą atrybutu style = "@ style / MyStyle", jak opisano w pierwszym łączu.
Cheryl Simon

Przepraszam, ale to nie powinna być odpowiedź. Zmiana listSelectorpowinna być.
Ayman Salah

63

Z ListView: Wyłącz podświetlenie Focus ,

po ustawieniu ListAdapterużyj następującego kodu

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

To zastąpi BaseAdapterklasę. Anuluje również białe obramowanie między komórkami.


4
Nieprawidłowe, to wyłącza zachowanie wyboru (OnItemClicked nie będzie uruchamiany) dla przedmiotu
Sandor,

6
To dobre rozwiązanie, ponieważ wyróżnienie elementu widoku listy jest bardziej problemem behawioralnym niż estetycznym. Możesz więc użyć tego do widoków list, których nie chcesz mieć właściwości wyboru. Styl globalny naprawdę nie ma sensu, ponieważ wiesz, że w końcu będziesz potrzebować widoku listy, który można wybrać, a używanie stylów do zachowania wydaje mi się niewłaściwe. Nie powinny mieć znaczenia semantycznego, tylko estetyczne. Właściwość selekcji jest kwestią semantyczną.
Thomas Dignan

Poza tym nie jest to odpowiedź na to pytanie, przesłanianie w isEnabledcelu wyłączenia elementu nie jest sposobem na jego wyłączenie! Dokumentacja mówi, że isEnabledma ustalić, czy element jest separatorem.
Bakhshi,

39

dodaj to również do swojego XMl wraz z listselector..hope nadzieję, że to zadziała

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

2
Wielkie dzięki. Chcę rozwiązać problem polegający na tym, że cała lista widoków jest podświetlona (kolor biały w moim przypadku) podczas przewijania (dzieje się to tylko przed Androidem 2.3). I to działa.
Yeung

„# 00000000” i „@android: kolor / przezroczysty” dla odmiany?
Androider

@Androider ya w 2011 roku Mówiłem ludziom, że to działa w obie strony ... Zdecydowanie dzisiaj nie będziecie potrzebować # 000000
arkusz

32

Jeśli używasz ArrayAdapterlub BaseAdapterdo wypełnienia elementów listy. sposób i powrotu .OverrideisEnabledfalse

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

13

Po kilku „googleach” i testowaniu na urządzeniach wirtualnych i rzeczywistych zauważam, że mój poniższy kod działa:

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

zauważ, że pominąłem tę areAllItemsEnabled()część.


to działało dla mnie. nie oznacza to jednak, że jeśli istnieje wiersz do rysowania dla stanu, który ma stan wyłączony, zmieni to również ich obraz? czy można wyłączyć klikanie, ale nie zmienić rysunku?
deweloper Androida

1
Ma to efekt uboczny, powodujący, że ListView nie wyświetla dzielników.
Maciej Pigulski

11

Nic mi nie pomaga, ale to:

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

W kodzie

listView.setSelector(getResources().getDrawable(R.drawable.transparent));

i dodaj mały przezroczysty obraz do folderu z możliwością rysowania.

Jak: 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

Dla mnie android:focusableInTouchMode="true"jest droga. android:listSelector="@android:color/transparent" nie ma sensu. Pamiętaj, że używam niestandardowego widoku listy z wieloma obiektami w każdym rzędzie.


5

Musisz tylko dodać: android:cacheColorHint="@android:color/transparent"


5

Jako alternatywa:

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

lub

listView.setSelector(new StateListDrawable());

1

Jest na to szybki i łatwy sposób: W metodzie:

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

Mam nadzieję, że to pomoże;)


To nie jest java
Anthony

Myślę, że większość programistów Androida nadal używa java, ponieważ to właśnie obsługuje Android Studio, ale można oczywiście używać C #. Chcę tylko wyjaśnić, że jest to C #: D
Anthony

0

Jeśli chcesz wyłączyć podświetlenie dla pojedynczego elementu widoku listy, ale zachować komórkę włączoną, ustaw kolor tła dla tej komórki, aby wyłączyć podświetlenie.

Na przykład w układzie komórki ustaw android:background="@color/white"


0

możesz po prostu zdobyć to pos, co otrzymujesz onItemClick i zrobić:

listView.setItemChecked(pos, false);

to najlepszy sposób, jaki znam

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.