Как текстовый фильтр Android ListView, поддерживаемый SimpleCursorAdapter?
У меня есть ListView, который поддерживается SimpleCursorAdapter.
Я хотел бы иметь возможность фильтровать список, как и список контактов, просто набрав текст, и я наткнулся на textFilterEnabled()
Проблема в том, что я не мог понять, как заставить ее работать с SimpleCursorAdapter.
Возможно ли это?
Если да, то как это делается?
Ответы
Ответ 1
Метод setTextFilterEnabled()
не выполняет автоматическую фильтрацию, так как он не знает, что в вашем Cursor
текст должен быть отфильтрован.
Этот поток разработчиков Android содержит более подробную информацию.
Собственно, на днях был задан хороший вопрос, который на самом деле очень похож на ваш вопрос; хотя вначале он спрашивал, как обрабатывать фильтрацию, когда на устройстве нет физической клавиатуры:
Ответ 2
Для курсора SimpleCursorAdapter вам нужно всего лишь использовать setFilterQueryProvider для запуска другого запроса для вашего курсора на основе ограничения:
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
}
});
Когда добавляется ограничение (например, с помощью TextView), адаптер должен быть отфильтрован:
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);
}
}
Надеюсь, это поможет. Я попытаюсь написать полную статью с исходным кодом в ближайшие несколько дней.
Ответ 3
Я нашел эту статью полезной http://androidcookbook.oreilly.com/Recipe.seam;jsessionid=CE37400B3E545937B70BE2E9F94E78BB?recipeId=404
в основном, вы setTextFilterEnabled(true)
в своем списке, и вы используете setStringConversionColumn()
и setFilterQueryProvider()
на SimpleCursorAdapter
.