Подтвердить что ты не робот

Как текстовый фильтр Android ListView, поддерживаемый SimpleCursorAdapter?

У меня есть ListView, который поддерживается SimpleCursorAdapter.

Я хотел бы иметь возможность фильтровать список, как и список контактов, просто набрав текст, и я наткнулся на textFilterEnabled()

Проблема в том, что я не мог понять, как заставить ее работать с SimpleCursorAdapter.

Возможно ли это? Если да, то как это делается?

4b9b3361

Ответ 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);
  }
}

Надеюсь, это поможет. Я попытаюсь написать полную статью с исходным кодом в ближайшие несколько дней.