Wie kann ich unter Android einen ListView
Filter basierend auf Benutzereingaben verwenden, bei dem die angezeigten Elemente basierend auf dem TextView
Wert dynamisch aktualisiert werden ?
Ich suche so etwas:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Antworten:
Zunächst müssen Sie ein XML-Layout erstellen, das sowohl einen EditText als auch eine ListView enthält.
Dadurch wird alles richtig dargestellt, mit einem schönen EditText über der ListView. Erstellen Sie als Nächstes eine ListActivity wie gewohnt, fügen Sie jedoch einen
setContentView()
Aufruf in dieonCreate()
Methode ein, damit wir unser kürzlich deklariertes Layout verwenden. Denken Sie daran, dass wir dieListView
speziell mit identifiziert habenandroid:id="@android:id/list"
. Dadurch können wirListActivity
wissen, welcheListView
wir in unserem deklarierten Layout verwenden möchten.Wenn Sie die App jetzt ausführen, sollte Ihre vorherige App
ListView
mit einem schönen Feld oben angezeigt werden. Damit diese Box etwas tut, müssen wir die Eingabe daraus entnehmen und diese Eingabe die Liste filtern lassen. Während viele Leute versucht haben, dies manuell zu tun, enthalten die meistenListView
Adapter
Klassen einFilter
Objekt, mit dem die Filterung automatisch durchgeführt werden kann. Wir müssen nur die Eingabe von derEditText
in die leitenFilter
. Es stellt sich heraus, dass das ziemlich einfach ist. Fügen Sie diese Leitung zu IhremonCreate()
Anruf hinzu, um einen Schnelltest durchzuführenBeachten Sie, dass Sie Ihre
ListAdapter
in einer Variablen speichern müssen, damit dies funktioniert. Ich habe meineArrayAdapter<String>
von früher in einer Variablen namens "Adapter" gespeichert .Der nächste Schritt besteht darin, die Eingabe von der zu erhalten
EditText
. Dies erfordert tatsächlich ein wenig Nachdenken. Sie könnten eineOnKeyListener()
zu Ihrer hinzufügenEditText
. Dieser Listener empfängt jedoch nur einige Schlüsselereignisse . Wenn ein Benutzer beispielsweise "wyw" eingibt, empfiehlt der Vorhersagetext wahrscheinlich "eye". Bis der Benutzer entweder "wyw" oder "eye" wählt, erhalten SieOnKeyListener
kein Schlüsselereignis. Einige mögen diese Lösung bevorzugen, aber ich fand sie frustrierend. Ich wollte jedes Schlüsselereignis, also hatte ich die Wahl, zu filtern oder nicht zu filtern. Die Lösung ist aTextWatcher
. Erstellen Sie einfach und fügen SieTextWatcher
zu demEditText
, und der PassListAdapter
Filter
einer Filteranforderung ändert dich der Text jedes Mal. Denken Sie daran, dasTextWatcher
In zu entfernenOnDestroy()
! Hier ist die endgültige Lösung:quelle
Durch Ausführen des Programms wird eine Kraft geschlossen.
Ich habe die Leitung getauscht:
mit
könnte das das problem sein Wofür ist die '@ + building_list'?
quelle
Ich hatte ein Problem mit der Filterung, die Ergebnisse wurden gefiltert, aber nicht wiederhergestellt !
Vor dem Filtern (Aktivitätsstart) habe ich eine Listensicherung erstellt. (Nur eine weitere Liste mit denselben Daten.)
Beim Filtern werden der Filter und der Listenadapter mit der Primärliste verbunden.
Der Filter selbst verwendete jedoch die Daten aus der gesicherten Liste.
Dies stellte in meinem Fall sicher, dass die Liste sofort aktualisiert wurde und selbst beim Löschen von Suchbegriffzeichen die Liste in jedem Fall erfolgreich wiederhergestellt wird :)
Trotzdem danke für diese Lösung.
quelle