How to text filter an Android ListView backed by a SimpleCursorAdapter?
For a SimpleCursorAdapter cursor, you only need to use the setFilterQueryProvider, to run another query for your cursor, based on the constraint:
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 }});
When a constraint is added (eg. by using a TextView) the adapter must be filtered:
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); }}
Hope this helps. I will try to write a complete article , with source code the next few days.
The setTextFilterEnabled()
method doesn't automatically implement filtering, as it doesn't know what in your Cursor
the text should be filtered against.
This android-developers thread has more details.
Actually, there was a good question asked the other day, which actually is very similar to your question; though it originally was asking how to handle filtering when there is no physical keyboard on a device:
i found this article helpful http://androidcookbook.oreilly.com/Recipe.seam;jsessionid=CE37400B3E545937B70BE2E9F94E78BB?recipeId=404
basically, you setTextFilterEnabled(true)
on your listview, and you use setStringConversionColumn()
and setFilterQueryProvider()
on your SimpleCursorAdapter
.