2009-11-23 3 views
0

на android у меня есть большой список, который должен поддерживать фильтрацию. На данный момент моя реализация такова.Внедрить поле поиска android

EditText и TextWatcher для прослушивания текстовых изменений. Все данные хранятся в db, и когда есть событие для TextChange, выберите курсор и установите новый CursorAdapter в listview. Я использую AsyncTask для запроса db и обновления gui.

Но приходит некоторые проблемы с этим подходом:

  1. AsyncTask запускается для каждого события TextChange.

  2. AsyncTask должны быть синхронизированы

Так что это лучший способ осуществить поле поиска для ListView, какие элементы хранятся в БД.

ответ

3

Большинство реализаций адаптера также реализовать Фильтруемые интерфейс, который очень полезен.

Filter filter = myAdapter.getFilter(); 
filter.filter(mySearchText); 

В соответствии с документацией Filter.filter (CharSequence ограничение) делает - запускает асинхронную операцию фильтрации. Вызов этого метода отменяет все предыдущие неисполненные запросы фильтрации и отправляет новый запрос на фильтрацию, который будет выполнен позже. Что отлично подходит моим потребностям.

0

В вашей деятельности сохраните статическую ссылку на AsyncTask, когда вы ее отпустите. Затем, если пользователь набирает еще один ключ до завершения предыдущей AsyncTask, вручную отмените его и начните с другого. Это должно облегчить большинство проблем (хотя у вас могут возникнуть проблемы с обновлением списка, если это большой набор данных). Что-то вроде следующего должно вам начать работу:

private static AsyncTask _currentFilterTask; 

public doFilter(String userInput) 
{ 
    if (_currentFilterTask != null && _currentFilterTask.getStatus().equals()) 
    { 
    _currentFilterTask.cancel(true); 
    } 
    _currentFilterTask = new MyAsyncTask(userInput); 
    _currentFilterTask.execute(this); 
} 
Смежные вопросы