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.

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.


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"
/>

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


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.


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"/> 

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;
  }

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 .


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"

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>

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.


5

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


5

Als Alternative:

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

oder

listView.setSelector(new StateListDrawable());

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;)


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"


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.