ArrayAdapter and android: textFilterEnabled - PullRequest
0 голосов
/ 17 мая 2010

Я создал макет, который включает в себя ListView.

Данные, показанные в этом ListView, не слишком сложны, в основном это массив, который передается при запуске расширенного действия.

Сами строки существуют из иконки и текста, таким образом, ImageView и TextView. Чтобы заполнить ListView, я использую ArrayAdapter просто потому, что передан Array, содержащий все текстовые элементы, которые должны быть показаны.

Теперь я хотел бы иметь возможность фильтровать их, поэтому я нашел параметр android: textFilterEnabled для добавления в объявление ListView xml ... Теперь поле поиска отображается красиво, но когда я введу несколько букв, оно не будет фильтроваться, а просто удалит весь список. Я узнал, что это потому, что textfilter не знает, что он должен фильтровать.

Итак, теперь мой вопрос: я знаю, что должен сказать текстовому фильтру, что он должен фильтровать, у меня также все еще есть свой массив, заполненный текстом, который должен быть отфильтрован, так как мне соединить эти два?

Я видел примеры, расширяющие CursorAdapter, но опять же, у меня нет Cursor, я не хочу делать вызовы в БД, я хочу повторно использовать мой Array с данными и, очевидно, сам ArrayAdapter, чтобы данные будут прилично представлены на экране (т.е. с моим макетом ImageView и TextView).

Как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

Ваш пользовательский адаптер должен реализовать интерфейс Filterable, переопределить getFilter() и вернуть экземпляр класса, который расширяет Filter в getFilter().

Я сделал так, чтобы создать экземпляр класса фильтрации и сохранить его в переменной экземпляра final внутри моего адаптера и вернуть его при вызове getFilter().

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

0 голосов
/ 17 мая 2010

Мне удалось использовать ArrayAdapter с "String" для параметра обобщенных параметров (т. Е. Я создаю его с ArrayAdapter<String> ... = new ArrayAdapter<String>(...)), в ListView и вызовом setTextFilterEnabled и setFilterText программно для их фильтрации. Ниже описано, как я это сделал в ListActivity :

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // This array list will be updated each time.
    final ArrayList<String> data = new ArrayList<String>();
    data.add("apple");
    data.add("orange");
    data.add("tomato");
    dataAdapter = new ArrayAdapter<String>(this, R.layout.item,
        R.id.itemName, data);

    setListAdapter(dataAdapter);
    ListView view = getListView();
    view.setTextFilterEnabled(true);
    view.setFilterText("ap");
}

Я также попробовал использовать адаптер, не основанный на строках, и полученный код можно получить по адресу здесь . В этом случае я создал объект с именем Item , который я хочу поместить в мои ListView и ArrayAdapter . Он фильтрует все, что возвращается методом toString объекта. В этом примере я toString фильтрует по имени элемента. Обратите внимание, что в отличие от приведенного выше случая, я установил свойство android: textFilterEnabled в файле XML моего представления вместо вызова setTextFilterEnabled , как вы описали.

...