2010-01-04 5 views
18

Ich habe eine ListView, die von einem SimpleCursorAdapter unterstützt wird.Wie filtert man einen Android ListView, der von einem SimpleCursorAdapter unterstützt wird?

Ich möchte in der Lage sein, die Liste zu filtern, wie Sie es einer Kontaktliste, indem Sie einfach, und ich kam in den textFilterEnabled()

Problem ist, konnte ich nicht sehen, wie es zu bekommen mit einem SimpleCursorAdapter arbeiten.

Ist das überhaupt möglich?
Wenn ja, wie wird es gemacht?

Antwort

7

Die setTextFilterEnabled() Methode nicht automatisch Filterung implementieren, da es nicht weiß, was in Ihrem Cursor der Text gefiltert gegen werden soll.

Diese android-developers thread hat mehr Details.

Tatsächlich wurde letztens eine gute Frage gestellt, die Ihrer Frage eigentlich sehr ähnlich ist; obwohl es ursprünglich war die Frage, wie Filterung behandeln, wenn es keine physische Tastatur auf einem Gerät:

24

Für einen SimpleCursorAdapter Cursor, Sie müssen nur die setFilterQueryProvider verwenden, eine andere Abfrage für Ihren Cursor zu laufen, auf der Grundlage der Einschränkung:

m_Adapter.setFilterQueryProvider(new FilterQueryProvider() { 

    public Cursor runQuery(CharSequence constraint) { 
    Log.d(LOG_TAG, "runQuery constraint:"+constraint); 
    //uri, projection, and sortOrder might be the same as previous 
    //but you might want a new selection, based on your filter content (constraint) 
    Cursor cur = managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
    return cur; //now your adapter will have the new filtered content 
    } 

}); 

Wenn eine Beschränkung hinzugefügt wird (. ZB durch eine Textview mit) der Adapter muss gefiltert werden:

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    Log.d(LOG_TAG, "Filter:"+s); 
    if (m_slvAdapter!=null) { 
    m_Adapter.getFilter().filter(s); 
    } 
} 

Hoffe, das hilft. Ich werde versuchen, einen kompletten Artikel mit Quellcode in den nächsten Tagen zu schreiben.

+1

Gute Antwort, eine der wenigen, die den RunQuery Teil mit Cursor zeigen - wäre noch besser, wenn Sie ein Beispiel für die Auswahl enthalten. Z.B. selection = FIELD_NAME_TO_FILTER + "Gefällt mir" + constraint.toString() + "'"; – DEzra

+2

Wie sollten wir einen Cursor in RunQuery aufrufen, wenn wir eine SQLite-Datenbank verwenden? Das Verwenden der gleichen databaseHelper-Instanz, die zum Erstellen des Cursors für SimpleCursorAdapter verwendet wird, gibt mir eine "Ungültige Anweisung in fillWindow()" -Fehler. – rohitmishra

+1

Gibt 'm_slvAdapter' den Status für' m_Adapter'? – r4m

Verwandte Themen