TL; DR: Sie wählen eine Option aus (a) meiner Listenansicht. Dann änderst du deine Meinung und tippst etwas in (b) meinen Bearbeitungstext ein. Wie lösche ich Ihre Listview-Auswahl und zeige nur Ihren Editiertext an? (und umgekehrt)
Ich habe eine Anwendung mit einer Listenansicht von Optionen sowie einem Bearbeitungstext, um eine eigene Option zu erstellen. Ich brauche den Benutzer, um entweder eine Option auszuwählen oder zu erstellen, aber nicht beides. Hier ist eine Zeichnung meines Layouts:
Wann immer der Benutzer eine Option aus der Listenansicht auswählt, setze ich ihn als "ausgewählt", indem ich ihn grün mache, etwa so:
%Vor%(dies ist der Hintergrund meiner Listview)
Problem: Ich möchte die Option listview abwählen, wenn der Benutzer beschließt, eine eigene Option einzugeben, da er nur eine Option haben kann.
Ich habe versucht, im Anschluss an auszuführen, aber nichts hebt die Auswahl auf.
> %Vor%Eine sehr verwirrende Zwangslage, jede Hilfe wird geschätzt!
Bearbeiten: Hier ist das Layout des edittext:
%Vor%Bearbeiten: Hier ist das Layout der Listenansicht:
%Vor%android:listSelector
) zeigt ein Klickereignis an, aber nicht ausgewählte Elemente . android:choiceMode
), um ausgewählte Elemente anzugeben. android:state_activated
auf ihre Root-Ansicht setzen. Geben Sie Ihrem Adapter entsprechende Layouts / Ansichten, um die ausgewählten Objekte korrekt darzustellen. Nun, die eingebaute Auswahl in ListView
ist auf den ersten Blick äußerst schwierig. Es gibt jedoch zwei Hauptunterscheidungen, die Sie beachten sollten, um eine solche Verwirrung zu vermeiden: Listenansicht selector und Wahlmodus .
Der ListView-Selektor ist eine auszeichnungsfähige Ressource, von der angenommen wird, dass sie ein Ereignis beim Anklicken eines Listenelements anzeigt . Sie können es entweder mit der XML-Eigenschaft android:listSelector
oder mit der Methode setSelector()
. Ich konnte es in Dokumenten nicht finden, aber mein Verständnis ist, dass diese Ressource keine einfache Farbe sein sollte, denn nachdem sie gezeichnet wird, wird sie nicht ohne drastische Änderungen in der Ansicht verschwinden (wie das Einstellen eines Adapters, das wiederum kann) verursachen, dass einige Fehler auftreten), daher sollte ein solches Zeichen nur während eines bestimmten Zustands sichtbar sein (z. B. android:state_pressed
) wird angewendet. Hier ist ein einfaches Beispiel für den Zeichenbereich, der als Listenansicht-Selektor verwendet werden kann.
Aus irgendeinem Grund können Sie keine Farbstatusliste als Listenansicht verwenden Selektor, aber immer noch einfache Farben (die meist ungeeignet sind) und State List Zeichen. Es macht die Dinge etwas verwirrend. Nach dem ersten Klick auf eine Listenansicht können Sie den Listenansichts-Selektor nicht einfach aus der Listenansicht entfernen.
Der Grundgedanke hierbei ist, dass der Listenansicht-Selektor nicht darauf ausgerichtet ist, das ausgewählte Element anzugeben.
Im ListView-Auswahlmodus wird für ausgewählte Elemente angegeben. Wie Sie vielleicht wissen, gibt es hauptsächlich zwei Auswahlmodi, die wir in ListView verwenden können - Single Choice und Multiple Choice. Sie ermöglichen die Verfolgung einer einzelnen oder mehrerer Zeilen, die jeweils ausgewählt sind. Sie können sie über android:choiceMode
XML-Eigenschaft oder setChoiceMode()
Methode.
Die ListView selbst hält ausgewählte Zeilen darin und informiert sie, welche zu einem bestimmten Zeitpunkt ausgewählt ist, indem sie android:state_activated
Eigenschaft der Zeilenstammansicht. Damit Ihre Zeilen diesen Status widerspiegeln, muss ihre Stammansicht eine entsprechende Zeichenmenge aufweisen, z. als Hintergrund. Hier ist ein Beispiel für solch ein Zeichen:
Sie können Zeilen mithilfe des setItemChecked()
programmgesteuert aktivieren oder deaktivieren. Methode. Wenn Sie möchten, dass ein ListView alle ausgewählten Elemente löscht, können Sie die clearChoices()
Methode. Sie können ausgewählte Elemente auch anhand der Familie der Methoden überprüfen: getCheckedItemCount()
, getCheckedItemIds()
, getCheckedItemPosition()
(für Single-Choice-Modus), getCheckedItemPositions()
(für den Multiple-Choice-Modus)
Wenn Sie die Dinge einfach halten möchten, verwenden Sie nicht den Listenansichts-Selektor, um ausgewählte Elemente anzugeben .
Statt Selektor tatsächlich zu entfernen, Layouts zu ändern und einen robusten Ansatz zu implementieren, können wir den Selektor bei Bedarf ausblenden und später anzeigen, wenn Sie auf ein ListView-Element klicken:
%Vor%Lassen Sie uns Ihren Code durchgehen und ihn den Regeln anpassen, die ich Schritt für Schritt beschrieben habe.
In Ihrem ListView-Layout ist der Selektor auf eine einfache Farbe eingestellt, und daher werden Ihre Elemente beim Klicken darauf farbig dargestellt. Das Zeichen, das Sie als ListView-Hintergrund verwenden, hat keine Auswirkungen, da sich der ListView-Status nicht ändert, wenn auf die Zeilen geklickt wird. Daher hat Ihr ListView immer nur @color/windowBackground
background.
Um Ihr Problem zu lösen, müssen Sie zunächst den Selektor aus dem ListView-Layout entfernen:
%Vor%
In den Kommentaren geben Sie Ihren Adapter wie folgt:
%Vor%Sie haben mich auch gefragt, ob es möglich ist, den Standardadapter weiter zu verwenden, um das gewünschte Verhalten zu erreichen. Das können wir sicher, aber trotzdem sind ein paar Änderungen nötig. Ich kann 3 Optionen für diesen Fall sehen:
1. Using standard Android überprüft Layout
Sie können einfach ein entsprechendes Standardlayout angeben - entweder eines der Layouts, die CheckedTextView
ohne geänderten Hintergrund als Root-Komponente oder als Komponente, die verwendet activatedBackgroundIndicator
als Hintergrund, der gezeichnet werden kann. Für Ihren Fall sollte die beste Option die % co_de sein % Stellen Sie es einfach wie in Ihrem simple_list_item_activated_1
-Konstruktor so ein:
Diese Option ist dem, was ich unter 'Standardadapter' verstehe, am nächsten.
2. Passen Sie Ihren Adapter an
Sie können das Standardlayout und meistens Standardadapter verwenden, mit einer kleinen Ausnahme, um eine Ansicht für Ihre Artikel zu erhalten. Führen Sie einfach eine anonyme Klasse ein und überschreiben Sie die Methode ArrayAdapter
, bietet Zeilenansichten mit zugehörigem Hintergrund, der gezeichnet werden kann:
3. Passen Sie Ihr Layout an
Die gebräuchlichste Methode zur Behebung dieses Problems ist natürlich die Einführung eines eigenen Layouts für die Elementansicht. Hier ist mein einfaches Beispiel:
%Vor% Ich habe es in einer Datei gespeichert getView()
Vergessen Sie nicht, dieses Layout in Ihrem Adapter festzulegen:
Danach spiegeln Ihre Zeilen den ausgewählten Status wider, wenn sie angeklickt werden, und Sie können den ausgewählten Status Ihres /res/layout/list_view_item.xml
leicht löschen, indem Sie ListView
und consequenz clearChoices()
, um die ListView zu bitten, sich selbst neu zu zeichnen.
Ein kleiner Kommentar hier, wenn Sie das Element abwählen möchten, wenn der Benutzer mit der Eingabe beginnt, aber nicht, wenn er tatsächlich auf die Schaltfläche "Zurück" (fertig) klickt, müssen Sie ein requestLayout()
Callback stattdessen:
Hoffentlich hat es geholfen.
Ich habe eine gute Lösung dafür. Fügen Sie EditText zu Ihrem Layout hinzu, das auf Ihrem ListView dieses Layout enthält:
%Vor% Initialisiere dann die boolesche Variable, um zu prüfen, ob editText, wenn fokussiert oder nicht, zum Beispiel folgendes verwendet: boolean canBeSelected = true;
Verwenden Sie nach dem Einstellen des Adapters diesen Code:
%Vor%Hoffe, es funktioniert mit dir:)
Haben Sie versucht, für jedes Element Ihres Listenadapters setselected?
%Vor%