ListView-Objekt bleibt nicht "ausgewählt"

8

Ich möchte den Hintergrund eines Listenansichtelements ändern, wenn der Benutzer darauf klickt. So ähnlich wie die Seite mit den Wabeneinstellungen (obwohl ich Ich beschäftige mich nicht nur mit Einstellungen, so dass ich PreferenceActivity nicht verwende. Ich habe diese Funktionalität durch einen Selektorstatus Selektor für den Ressourcenstatus ausgeführt, mit Ausnahme der Fälle, in denen beim Klicken auf das Listenansichtsmenü das lineare Layout rechts von der Listenansicht geändert wird eine geteilte Bildschirmansicht). Ich nehme an, die Listview verliert den Fokus, so dass state_pressed nicht mehr wahr ist.

%Vor%

Irgendwelche Tipps, um das Listenansichtselement so lange farbig zu halten, bis ein anderes Listenansichtselement ausgewählt wird? Danke!

BEARBEITEN:

Ich konnte den Hintergrund in einem setOnItemClickListener mit

ändern lassen %Vor%

Ich brauche nur jeweils eine ausgewählt, also wenn ich die anderen Listenelemente angeklickt habe, habe ich lv.invalidate() und lv.getChildAt(0).invalidate() ausprobiert, aber keiner hat funktioniert und der zweite bewirkt eine Nullzeiger-Ausnahme. Irgendwelche Ideen zum Zurücksetzen der Farbe?

    
yellavon 15.04.2011, 20:30
quelle

10 Antworten

9

Wenn Sie Ihren Finger von der Zelle loslassen, wird er nicht länger als gedrückt registriert. Was Sie tun wollen, ist eigentlich den Hintergrund der einzelnen Zeile ändern, wenn ein Benutzer wählt ist. Dies bedeutet, dass Sie ein onItemClick oder onItemTouch implementieren und dem Adapter das Neuzeichnen der Zeile mit dem neuen Flag zuweisen Hintergrund. Wenn Sie bereits einen benutzerdefinierten Listenadapter verwenden, können Sie in Ihrer getView () -Methode einfach eine Überprüfung auf einen booleschen Wert implementieren. Sie müssen auch verfolgen, welche Zeilen ausgewählt sind und welche nicht.

Pseudocode:

%Vor%     
sgarman 15.04.2011, 20:40
quelle
5

Hoffe diese Hilfe,

1.- Erstellen Sie eine Formdatei für das fokussierte Element: \ drawable \ list_selector_focused.xml

%Vor%

2.- Erstellen Sie eine Formdatei für das gedrückte Element: \ drawable \ list_selector_pressed.xml

%Vor%

3.- Erstellen Sie eine Listenauswahldatei: \ drawable \ list_selector.xml

%Vor%

4.- Fügen Sie dieses Attribut Ihrem ListView in der Layoutdatei hinzu:

%Vor%

Sie können Farben anstelle von Verlaufsformen verwenden,

    
user2180389 17.03.2013 22:02
quelle
3

Dies ist die Implementierung von sgarman Idee:

%Vor%

Es geht nur darum, dass es zu teuer sein kann, einen neuen Listener für jede getView () - Iteration einzurichten

    
Oleg Koshkin 23.09.2011 09:17
quelle
3

Der getestete Android-Status wird am besten verwendet, um dieses Problem zu beheben.

Jemand erwähnte mit Android: background="? android: attr / activatedBackgroundIndicator".

Dies zeigt nur auf eine der activated_background_ * Ressourcen in frameworks / base / core / res / res / drawable des Android Quellcodes. Zum Beispiel activated_background_holo_dark.xml:

%Vor%

Sie möchten also im Wesentlichen state_activated verwenden, um darzustellen, wenn der Benutzer die Schaltfläche ebenfalls drückt, wenn er sich in einem überprüften Zustand (d. h. in einem dauerhaft ausgewählten Zustand) befindet. Beachten Sie, dass die Aktivierung erst nach Honeycomb eingeführt wurde. Wenn Sie auf ältere Geräte abzielen, müssen Sie sich auf state_checked verlassen (weitere Details finden Sie hier hier ).

Wenn Sie nun ein Objekt als aktiviert markieren möchten, müssen Sie listView.setItemChecked(position, true) aufrufen. Wahrscheinlich möchten Sie die android:choiceMode -Eigenschaft in Ihrer ListView auf den entsprechenden Wert setzen (wenn Sie beispielsweise nur eine Sache ausgewählt haben möchten, verwenden Sie singleChoice ). Sie müssen nicht ungültig machen, der Aufruf von setItemChecked löst ein Relayout aus, das die Ansicht aktualisiert.

Seien Sie auch vorsichtig, wenn Sie das Neuordnen von Elementen in Ihrem ListView zulassen, da die aktuell überprüften Elemente aktualisiert werden müssen. Wenn Sie stabile IDs verwenden, wird dies automatisch verarbeitet.

Um ein Beispiel dafür in Aktion zu sehen, sehen Sie sich den NavigationDrawer-Beispielcode aus der Trainingsserie an: Ссылка .

    
quelle
2

Standardmäßig ist "Ausgewählt" nicht identisch mit "Geklickt", wenn Sie eine Touch-Oberfläche verwenden - etwas, was mir beim Start der Android-Entwicklung einige Kopfschmerzen bereitet.

Um sowohl Benutzer zu unterstützen, die nach Berührung navigieren, als auch Benutzer, die Scrollräder / Trackballs verwenden, sollten Sie setSelection , und machen Sie Ihre Manipulation in einem AdapterView.OnItemSelectedListener Implementierung (festgelegt mit setOnItemSelectedListener ).

Ein weiteres Problem ist, dass setSelection kein Element hervorhebt wenn das letzte Ereignis ein Berührungsereignis war.

Ich würde empfehlen, dass Sie eine benutzerdefinierte Ansicht für Ihre Listenelemente erstellen und die Hervorhebung dort behandeln.

Hoffe, das hilft,

Phil Lello

    
Phil Lello 15.04.2011 21:33
quelle
0

Ok, also habe ich die obige Lösung ausprobiert, wo es heißt "Dies ist die Implementierung von sgarman idea:" Das funktioniert nur, wenn SetFocusListener ein OnTouchListner ist. Andernfalls verbraucht die onClick-Methode den Klick. Ich musste diese Lösung mit einem OnItemClick-Listener auf meinem Listenelement verknüpfen, um die Liste zu erhalten, um das markierte Element tatsächlich anzuzeigen.

    
musterjunk 18.10.2014 17:26
quelle
0

Ich habe android:state_activated="true" anstelle von state_selected verwendet. Es funktioniert wie ein Zauber!

    
user3786018 20.01.2015 12:53
quelle
0

Wenn du deinen listView durch die gesamte Aktivität führst, kannst du mListView.isItemChecked(position) in der getView() Methode machen. Und sie legen die Hintergrundfarbe abhängig vom Ergebnis fest.

    
Jp_ 27.02.2015 20:21
quelle
-2

Hast du android:state_selected="true" versucht?

    
djg 15.04.2011 20:39
quelle
-2

probiere

aus %Vor%

;)

    
Michael D 30.03.2013 19:09
quelle