Auswahl aufheben, wenn Text eingegeben wird?

8
  

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.

  1. Der Benutzer wählt eine Option aus der Listenansicht
  2. aus
  3. Der Benutzer entscheidet, dass er eine eigene Option mit dem Editiertext
  4. erstellen möchte
  5. Die Option listview wird nicht ausgewählt, wenn sie mit der Eingabe eines eigenen
  6. beginnen

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%     
Ruchir Baronia 14.01.2018, 20:14
quelle

4 Antworten

4

Lange Geschichte kurz

  • Der ListView-Selektor ( android:listSelector ) zeigt ein Klickereignis an, aber nicht ausgewählte Elemente .
  • Wenn ein ListView-Selektor gezeichnet wird (nach dem ersten Klick), verschwindet er nicht ohne drastische Änderungen in der ListView
  • Verwenden Sie daher nur Zeichen mit transparentem Hintergrund, wenn kein Status als ListView-Selektor angewendet wird. Verwenden Sie keine einfache Farbressource dafür, verwechseln Sie sich nicht .
  • Verwenden Sie den ListView-Auswahlmodus ( android:choiceMode ), um ausgewählte Elemente anzugeben.
  • ListView zeigt an, welche Zeile ausgewählt wurde, indem Sie android:state_activated auf ihre Root-Ansicht setzen. Geben Sie Ihrem Adapter entsprechende Layouts / Ansichten, um die ausgewählten Objekte korrekt darzustellen.

Theorie

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 .

ListView-Selektor

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.

%Vor%

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.

ListView-Auswahlmodus

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:

%Vor%

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)

Fazit

Wenn Sie die Dinge einfach halten möchten, verwenden Sie nicht den Listenansichts-Selektor, um ausgewählte Elemente anzugeben .

Lösung des Problems

Option 1.Dirty fix - hide selector

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%

Option 2. Durchdachter Weg

Lassen Sie uns Ihren Code durchgehen und ihn den Regeln anpassen, die ich Schritt für Schritt beschrieben habe.

Fixiere das ListView-Layout

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%

Stellen Sie fest, dass Ihre Zeilen den aktivierten Status widerspiegeln

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:

%Vor%

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:

%Vor%

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:

%Vor%

Löschen Sie bei Bedarf die Auswahl

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:

%Vor%

Hoffentlich hat es geholfen.

    
Aleksandr Medvedev 17.01.2018 06:15
quelle
0

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

    
T.G.ALShammari 20.01.2018 13:51
quelle
0

Das Anpassen des Adapters im Listeneditor für editierte Texte funktionierte für mich:

%Vor%

Ich habe den ausgewählten Index auf einen Toast gesetzt, um zu prüfen, ob der Artikel korrekt abgewählt wurde.

Hoffe, das funktioniert !!

    
MykeAngel 23.01.2018 17:12
quelle
-1

Haben Sie versucht, für jedes Element Ihres Listenadapters setselected?

%Vor%

Ссылка

    
quelle

Tags und Links