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.

John Moffitt
źródło

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 .

RoflcoptrException
źródło
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"
/>
Mushtaq Jameel
źródło
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

Cheryl Simon
źródło
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.

emdog4
źródło
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"/> 
arkuszowy
źródło
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;
  }
Libin
źródło
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ęść.

aerobrain
źródło
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"
Dmitrij Czistyakow
źródło
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>
Robert Bae Dong Hwan
źródło
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.

erdomester
źródło
5

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

Prakash
źródło
5

Jako alternatywa:

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

lub

listView.setSelector(new StateListDrawable());
Natali
źródło
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;)

FeldonDragon
źródło
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"

Radość
źródło
0

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

listView.setItemChecked(pos, false);

to najlepszy sposób, jaki znam

Naczelny Madog
źródło