На Android, как я могу ListView
фильтровать на основе пользовательского ввода, где показанные элементы обновляются динамически в зависимости от TextView
значения?
Я ищу что-то вроде этого:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Ответы:
Во-первых, вам нужно создать макет XML, который имеет и EditText, и ListView.
Это выложит все правильно, с хорошим EditText над ListView. Затем создайте ListActivity, как обычно, но добавьте
setContentView()
вызов вonCreate()
метод, чтобы мы использовали наш недавно объявленный макет. Помните, что мы определилиListView
специально, сandroid:id="@android:id/list"
. Это позволяетListActivity
узнать, чтоListView
мы хотим использовать в нашем объявленном макете.Запущенное приложение теперь должно показать ваше предыдущее
ListView
, с красивой рамкой выше. Чтобы заставить этот блок что-то делать, нам нужно взять входные данные из него и сделать этот фильтр фильтрующим список. Хотя многие пытались сделать это вручную, большинствоListView
Adapter
классовFilter
содержат объект, который можно использовать для автоматической фильтрации. Нам просто нужно передать данные изEditText
вFilter
. Оказывается, это довольно легко. Чтобы выполнить быстрый тест, добавьте эту строку в свойonCreate()
звонокОбратите внимание, что вам нужно сохранить вашу
ListAdapter
переменную, чтобы сделать эту работу - я сохранил свойArrayAdapter<String>
ранее в переменную под названием «адаптер».Следующий шаг - получить информацию от
EditText
. Это на самом деле занимает немного мысли. Вы можете добавитьOnKeyListener()
к своемуEditText
. Однако этот слушатель получает только некоторые ключевые события . Например, если пользователь вводит «wyw», предиктивный текст, скорее всего, порекомендует «eye». Пока пользователь не выберет «wyw» или «eye», выOnKeyListener
не получите ключевое событие. Некоторые могут предпочесть это решение, но я нахожу это разочаровывающим. Я хотел каждое ключевое событие, поэтому у меня был выбор фильтрации или не фильтрации. Решение естьTextWatcher
. Просто создайте и добавьтеTextWatcher
кEditText
, и передайтеListAdapter
Filter
запрос фильтра каждый раз, когда текст изменяется. Не забудьте удалитьTextWatcher
вOnDestroy()
! Вот окончательное решение:источник
запуск программы вызовет принудительное закрытие.
Я поменял линию:
с участием
Может ли это быть проблема? Для чего нужен «@ + building_list»?
источник
У меня была проблема с фильтрацией, результаты были отфильтрованы, но не восстановлены !
поэтому перед фильтрацией (началом активности) я создал резервную копию списка .. (просто еще один список, содержащий те же данные)
при фильтрации фильтр и listadapter подключаются к основному списку.
но сам фильтр использовал данные из резервного архива.
в моем случае это гарантировалось, что список обновлялся немедленно, и даже при удалении символов-терминов поиска список успешно восстанавливался в каждом случае :)
спасибо за это решение в любом случае.
источник