Ist es möglich, über die Listenauswahl einen benutzerdefinierten Hintergrund auf jedes Listview-Element anzuwenden?
Die Standardauswahl gibt @android:color/transparent
den state_focused="false"
Fall an, aber das Ändern dieser Auswahl in eine benutzerdefinierte Zeichnungsfunktion wirkt sich nicht auf Elemente aus, die nicht ausgewählt sind. Romain Guy scheint in dieser Antwort darauf hinzuweisen, dass dies möglich ist.
Ich erreiche derzeit den gleichen Effekt, indem ich für jede Ansicht einen benutzerdefinierten Hintergrund verwende und ihn ausblende, wenn das Element ausgewählt / fokussiert / was auch immer angezeigt wird, aber es wäre eleganter, dies alles an einem Ort zu definieren.
Als Referenz ist dies der Selektor, mit dem ich versuche, dies zum Laufen zu bringen:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false"
android:drawable="@drawable/list_item_gradient" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false"
android:state_pressed="true"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="true"
android:drawable="@drawable/list_selector_background_focus" />
</selector>
Und so stelle ich den Selektor ein:
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@drawable/list_selector_background" />
Vielen Dank im Voraus für jede Hilfe!
Die Lösung von dglmtn funktioniert nicht, wenn Sie ein 9-Patch-Zeichenelement mit Polsterung als Hintergrund haben. Seltsame Dinge passieren, ich möchte nicht einmal darüber sprechen, wenn Sie ein solches Problem haben, kennen Sie sie.
Wenn Sie eine Listenansicht mit verschiedenen Status und 9-Patch-Drawables haben möchten (ich denke, es würde mit allen Drawables und Farben funktionieren), müssen Sie zwei Dinge tun:
Was Sie tun sollten, ist zuerst die row_selector.xml zu setzen:
Vergiss das nicht
android:state_selected
. Es funktioniert wieandroid:state_focused
für die Liste, wird jedoch für das Listenelement angewendet.Wenden Sie nun den Selektor auf die Elemente an (row.xml):
Machen Sie eine transparente Auswahl für die Liste:
Das sollte das Ding machen.
quelle
Verwenden Sie niemals eine "Hintergrundfarbe" für Ihre Listenansichtszeilen ...
Dies blockiert jede Auswahlaktion (war mein Problem!)
Viel Glück!
quelle
setBackgroundColor
mit einer "Farbe" verwendet habe. Seufz ... Verwenden SiesetBackground
odersetBackgroundDrawable
entsprechend Ihrer API-Version mit einem Selektor.Der Artikel "Warum ist meine Liste schwarz? Eine Android-Optimierung" im Android Developers Blog enthält eine ausführliche Erklärung, warum der Listenhintergrund beim Scrollen schwarz wird. Einfache Antwort: Setzen Sie cacheColorHint in Ihrer Liste auf transparent (# 00000000).
quelle
Es ist genug, wenn Sie Folgendes eingeben
list_row_layout.xml
:listitem_selector.xml:
quelle
anstatt:
schreiben
quelle
Sie können ein Thema schreiben:
theme.xml
styles.xml
my_selector ist Ihr Wunsch, einen benutzerdefinierten Selektor zu erstellen. Es tut mir leid, dass ich nicht weiß, wie ich meinen Code schreiben soll
quelle
Ich bin mir nicht sicher, wie Sie den gewünschten Effekt über den Selektor selbst erzielen können - schließlich gibt es per Definition einen Selektor für die gesamte Liste.
Sie können jedoch die Auswahländerungen steuern und zeichnen, was Sie möchten. In diesem Beispielprojekt mache ich den Selektor transparent und zeichne einen Balken auf das ausgewählte Element.
quelle
<item android:state_focused="false" android:drawable="@android:color/transparent" />
Klausel im Standard-Selektor.Ich benutze immer die gleiche Methode und sie funktioniert jedes Mal und überall: Ich benutze einfach einen Selektor wie diesen
und setzen Sie in der ListView (DAS IST SEHR WICHTIG, damit es funktioniert) das Attribut
für die textColor legen Sie einfach in den Farbordner (WICHTIG, nicht zeichnbarer Ordner!) eine Auswahl wie diese
Dies ist eine Beispielzeilenvorlage
Alles funktioniert ohne langwierige Problemumgehungen. Ich hoffe das hilft
quelle
FrostWire Team hier.
Alle Selector Crap API funktioniert nicht wie erwartet. Nachdem wir alle in diesem Thread vorgestellten Lösungen als nicht gut ausprobiert haben, haben wir das Problem gerade im Moment des Aufblasens des ListView-Elements gelöst.
Stellen Sie sicher, dass Ihr Artikel seinen Status beibehält. Wir haben ihn als Mitgliedsvariable des MenuItem erstellt (Boolescher Wert ausgewählt).
Fragen Sie beim Aufblasen, ob das zugrunde liegende Element ausgewählt ist. Wenn ja, legen Sie einfach die gewünschte zeichnbare Ressource als Hintergrund fest (sei es ein 9-Patch oder was auch immer). Stellen Sie sicher, dass Ihr Adapter dies weiß und notifyDataChanged () aufruft, wenn etwas ausgewählt wurde.
Es wäre wirklich schön, wenn die Selektoren tatsächlich funktionieren würden. Theoretisch ist es eine schöne und elegante Lösung, aber es scheint, als wäre sie kaputt. KUSS.
quelle