2010-01-04 19 views
18

Ho una ListView supportata da SimpleCursorAdapter.Come filtrare un ListView Android supportato da SimpleCursorAdapter?

mi piacerebbe essere in grado di filtrare l'elenco come si farebbe un elenco di contatti, semplicemente digitando, e mi sono imbattuto nel textFilterEnabled()

Il problema è che non ho potuto vedere come ottenerlo per lavorare con SimpleCursorAdapter.

È possibile?
Se sì, come è fatto?

risposta

7

Il metodo setTextFilterEnabled() non implementa automaticamente il filtraggio, in quanto non sa cosa nel Cursor il testo deve essere filtrato contro.

Questo android-developers thread ha ulteriori dettagli.

In realtà, c'era una buona domanda posta l'altro giorno, che in realtà è molto simile alla tua domanda; anche se in origine stava chiedendo come gestire il filtro quando non c'è tastiera fisica su un dispositivo:

24

Per un cursore SimpleCursorAdapter, è sufficiente utilizzare il setFilterQueryProvider, per eseguire un'altra query per il cursore, sulla base del vincolo:

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 
    } 

}); 

Quando si aggiunge un vincolo (es. Utilizzando un TextView) l'adattatore deve essere filtrato:

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); 
    } 
} 

Spero che questo aiuti. Proverò a scrivere un articolo completo, con il codice sorgente nei prossimi giorni.

+1

Una buona risposta, una delle poche che mostra la parte runQuery con il cursore, sarebbe ancora meglio se includessi un esempio della selezione. Per esempio. selection = FIELD_NAME_TO_FILTER + "like '" + constraint.toString() + "'"; – DEzra

+2

Come dovremmo chiamare un cursore in runQuery se stiamo usando un database SQLite? L'utilizzo della stessa istanza databaseHelper di quella utilizzata per creare il cursore per SimpleCursorAdapter mi dà un errore "Istruzione non valida in fillWindow()". – rohitmishra

+1

Lo stato di 'm_slvAdapter' per' m_Adapter'? – r4m

Problemi correlati