Android: Deaktivieren der Hervorhebung beim Klicken auf listView

302

Ich möchte die orangefarbene Markierung deaktivieren, die beim Berühren einer listView-Zeile auftritt. Bisher habe ich in meiner XML Folgendes versucht:

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

Weitere Informationen: Ich möchte, dass es keinen Unterschied gibt, wenn ein Benutzer den Bildschirm dieses listView-Objekts berührt.

John Moffitt
quelle

Antworten:

674

Fügen Sie dies Ihrer XML hinzu:

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

Und für das Problem kann dies funktionieren (ich bin mir nicht sicher und weiß nicht, ob es bessere Lösungen gibt):

Sie können eine ColorStateList auf Ihre Textansicht anwenden.

RoflcoptrException
quelle
2
Wenn transparent die Auswahl noch ein wenig verdunkelt, wird sie möglicherweise nicht als vollständig transparent definiert. Versuchen Sie stattdessen # 00000000, dies ist völlig unsichtbar.
Ridcully
Perfekte Lösung für mich. Ich habe versucht, eine transparente XML-Auswahl festzulegen, die für den Hintergrund der Listenansichten rund um das Layout gezeichnet werden kann. Dies führte jedoch zu der oben genannten orangefarbenen Leiste auf ICS-Geräten.
Markus Rudel
@RoflcoptrException Ich verwende eine Fragmentfür die Liste. Das XML-Layout enthält ein LinearLayoutund mehrere TextViewElemente. Wo soll ich die Zeilenhervorhebung deaktivieren?
JJD
40
Mit Java Code können Sie tunlistView.setSelector(android.R.color.transparent);
Sulai
@RoflcoptrException -> "Sie können eine ColorStateList auf Ihre Textansicht anwenden" - Dies ist eine gute Option, wenn die Listenzeilen nicht anklickbar sind. Sobald die Textansicht anklickbar ist, wird das onClick-Ereignis der Liste selbst nicht ausgelöst.
Sebastian Hojas
189

Die Antwort von RoflcoptrException sollte den Trick machen, aber aus irgendeinem Grund hat es bei mir nicht funktioniert. Ich poste also die Lösung, die bei mir funktioniert hat, hoffe, sie hilft jemandem

<ListView 
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
/>
Mushtaq Jameel
quelle
101

Der orangefarbene Hervorhebungseffekt ist ein Stil in der ListView. Dieser Artikel bietet einen guten Überblick über das Überschreiben des listView-Stils.

Im Wesentlichen haben Sie einen Selektor, der basierend auf dem aktuellen Status verschiedene Stilelemente angibt.

Eine kurze und schnelle Lösung finden Sie unter https://stackoverflow.com/a/12242564/185022

Cheryl Simon
quelle
Kann ich mit dieser Methode für jedes listView-Objekt einen anderen Stil festlegen? Ist es auch möglich, das Problem zu vermeiden, das ich in Sebis Antwort angesprochen habe?
John Moffitt
1
Ja, Sie können alle Stilattribute überschreiben. Sie können jeder ListView mit dem Attribut style = "@ style / MyStyle" einen Stil zuweisen, wie im ersten Link beschrieben.
Cheryl Simon
Es tut mir leid, aber das sollte nicht die Antwort sein. Ändern listSelectorsollte es sein.
Ayman Salah
63

In ListView: Fokusmarkierung deaktivieren ,

Wenn Sie Ihre ListAdapterVerwendung einstellen, geben Sie den folgenden Code ein

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

Dadurch wird die BaseAdapterKlasse überschrieben . Außerdem wird der weiße Rand zwischen den Zellen aufgehoben.

emdog4
quelle
4
Ungültig, das ist deaktiviert das Auswahlverhalten (OnItemClicked wird nicht ausgelöst) für den Artikel
Sandor
6
Dies ist eine gute Lösung, da die Frage, ob ein Listenansichtselement hervorgehoben ist, eher ein Verhaltensproblem als ein ästhetisches Problem darstellt. Sie können dies also für die Listenansichten verwenden, für die Sie nicht die Eigenschaft haben möchten, auswählbar zu sein. Ein globaler Stil nicht wirklich Sinn, da Sie wissen , dass Sie schließlich einen Listview gehen zu wollen , die können ausgewählt werden und unter Verwendung von Stilen für das Verhalten mir falsch zu sein scheine. Sie sollten keine semantische Bedeutung haben, sondern nur ästhetische. Die Eigenschaft der Selektierbarkeit ist eine semantische Sache.
Thomas Dignan
Abgesehen davon ist dies nicht die Antwort auf diese Frage. Das Überschreiben isEnabledzum Deaktivieren eines Elements ist nicht der Weg, um es zu deaktivieren! Die Dokumentation besagt, dass isEnabledbestimmt werden soll, ob ein Element ein Trennzeichen ist.
Bakhshi
39

füge dies auch zu ur XMl zusammen mit listselector hinzu. Ich hoffe, es wird funktionieren

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 
Blatt
quelle
2
Danke vielmals. Ich möchte das Problem lösen, dass beim Scrollen die gesamte listView hervorgehoben wird (in meinem Fall weiße Farbe) (nur vor Android 2.3). Und es funktioniert.
Yeung
"# 00000000" und "@android: color / transparent" für Abwechslung?
Androider
@ Androider ya im Jahr 2011 Ich habe die Leute wissen lassen, dass es in beide Richtungen funktioniert ... Auf jeden Fall brauchen Sie heute nicht # 000000
Blatt
32

Wenn Sie die Listenelemente verwenden ArrayAdapteroder BaseAdapterfüllen. Overridedie isEnabledMethode und zurück false.

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

Nach ein paar "google" und Tests auf virtuellen und realen Geräten stelle ich fest, dass mein unten stehender Code funktioniert:

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

Beachten Sie, dass ich den areAllItemsEnabled()Teil weggelassen habe .

Aerobrain
quelle
das hat bei mir funktioniert. Bedeutet dies jedoch nicht, dass ein Zeichen für die Zeilen mit deaktiviertem Status auch deren Image ändert? Ist es möglich, das Klicken zu deaktivieren und das Zeichnen dennoch nicht zu ändern?
Android-Entwickler
1
Dies hat einen Nebeneffekt, der dazu führt, dass ListView keine Teiler anzeigt.
Maciej Pigulski
11

Nichts hilft mir außer diesem:

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"
Dmitry Chistyakov
quelle
7

in Code

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

und fügen Sie dem zeichnbaren Ordner ein kleines transparentes Bild hinzu.

Wie: 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
quelle
5

Für mich android:focusableInTouchMode="true"ist der Weg zu gehen. android:listSelector="@android:color/transparent" ist nutzlos. Beachten Sie, dass ich eine benutzerdefinierte Listenansicht mit einer Anzahl von Objekten in jeder Zeile verwende.

erdomester
quelle
5

Sie müssen nur hinzufügen: android:cacheColorHint="@android:color/transparent"

Prakash
quelle
5

Als Alternative:

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

oder

listView.setSelector(new StateListDrawable());
Natali
quelle
1

Es gibt eine schnelle und einfache Möglichkeit, dies zu tun: In Methode:

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

Hoffe es wird helfen;)

FeldonDragon
quelle
Dies c # nicht Java
Anthony
Ich denke, die meisten Android-Programmierer verwenden immer noch Java, da dies von Android Studio unterstützt wird, aber C # kann natürlich verwendet werden. Ich möchte nur klarstellen, dass dies C #: D
Anthony
0

Wenn Sie die Hervorhebung für ein einzelnes Listenansichtselement deaktivieren möchten, die Zelle jedoch aktiviert lassen möchten, legen Sie die Hintergrundfarbe für diese Zelle fest, um die Hervorhebung zu deaktivieren.

Legen Sie beispielsweise in Ihrem Zellenlayout fest android:background="@color/white"

Freude
quelle
0

Sie können einfach das bekommen pos, was Sie von der bekommen onItemClick und tun:

listView.setItemChecked(pos, false);

Das ist der beste Weg, den ich kenne

Chef Madog
quelle