Ich habe kürzlich eine Prämie zu this SO question hinzugefügt, aber realisieren Sie die ursprüngliche Frage fragt nach einem SimpleAdapter und nicht nach einem ArrayAdapter. Diese Frage bezieht sich also auf den ArrayAdapter:ArrayAdapter - Filterung mit mehreren Suchbegriffen
Ich möchte einen ArrayAdapter in einem ListView mit mehreren Suchbegriffen filtern können. Wenn zum Beispiel meine Liste enthält die folgenden Elemente:
a thing
another thing
a different thing
nothing
some thing
Wenn ich für ‚Ding‘ zu suchen dann alle die Begriffe sollten in den Filterergebnissen zurückgegeben werden. Dies ist ein normales Verhalten, das unter Verwendung des folgenden Codes erreicht werden kann:
private TextWatcher filterTextWatcher = new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
myAdapter.getFilter().filter(s.toString());
}
};
Jedoch; wenn ich den Suchbegriff ‚a thing
‘ eingeben, erwarte ich, dass die folgenden Ergebnisse angezeigt werden:
a thing
another thing
a different thing
In der Tat, alles, was ich bekomme im Ergebnis zurückgegeben ‚a thing
‘. Da der Filter nach der gesamten Zeichenfolge sucht, behandelt er den Bereich als Teil des Suchbegriffs. Was ich im Grunde frage ist, wie filtere ich die Liste nicht durch eine bestimmte Zeichenfolge, sondern durch mehrere Suchbegriffe, die jeweils durch Leerzeichen getrennt sind? Solange jeder der Suchbegriffe mindestens einmal im Artikel erscheint, sollte dieser Artikel im Ergebnis zurückgegeben werden.
Ähnliche Fragen scheinen zuvor schon auf SO gestellt worden zu sein (siehe zum Beispiel den Link oben in diesem Post, der SimpleAdapters betrifft), aber nirgends habe ich einen tatsächlichen Weg gefunden, dies zu erreichen. Ich nehme an, die Antwort würde beinhalten, den Suchausdruck in einzelne Zeichenfolgen zu trennen, die durch das Leerzeichen begrenzt sind, und dann die Suche mehrmals in jeder Zeichenfolge ausführen und nur die Ergebnisse zurückgeben, die für der Iterationen ...
übereinstimmen
Warum erhalte ich das schrecklich "was bin ich dabei" Gefühl? Können Sie den Adapter nicht erweitern, überschreiben Sie dann die Methode getFilter(), erstellen Sie einen eigenen Filter, überschreiben Sie performFiltering() und verwenden Sie eine Regex, um eine beliebige Sammlung zurückzugeben, z. ArrayList, brauchst du? – Simon
Ich werde meinen Kommentar hier lassen, falls jemand den gleichen Fehler macht wie ich und den Punkt vermisst, dass Sie den Adapter nicht verlängern wollen. Do! Es tut uns leid! – Simon
Hmm, das kann nicht ohne ArrayAdapter erweitert werden, da es keine Schnittstelle gibt, um den Filter zu ändern. Warum willst du keinen benutzerdefinierten Adapter schreiben? – Sam