No Android, como ListView
filtrar com base na entrada do usuário, onde os itens mostrados são atualizados dinamicamente com base no TextView
valor?
Estou procurando algo parecido com isto:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Respostas:
Primeiro, você precisa criar um layout XML que tenha um EditText e um ListView.
Isso organizará tudo corretamente, com um bom EditText acima do ListView. Em seguida, crie uma ListActivity como faria normalmente, mas adicione uma
setContentView()
chamada noonCreate()
método para usar nosso layout declarado recentemente. Lembre-se de que identificamos oListView
especialmente comandroid:id="@android:id/list"
. Isso permite que oListActivity
saber o queListView
queremos usar em nosso layout declarado.A execução do aplicativo agora deve mostrar o anterior
ListView
, com uma boa caixa acima. Para fazer com que essa caixa faça alguma coisa, precisamos extrair a entrada dela e fazer com que essa entrada filtre a lista. Embora muitas pessoas tenham tentado fazer isso manualmente, a maioria dasListView
Adapter
classes vem com umFilter
objeto que pode ser usado para executar a filtragem automaticamente. Nós só precisamos canalizar a entrada doEditText
para oFilter
. Acontece que é bem fácil. Para executar um teste rápido, adicione esta linha à suaonCreate()
chamadaObserve que você precisará salvar sua
ListAdapter
em uma variável para fazer esse trabalho - eu salvei meuArrayAdapter<String>
anterior em uma variável chamada 'adaptador'.O próximo passo é obter a entrada do
EditText
. Isso realmente requer um pouco de reflexão. Você pode adicionar umOnKeyListener()
ao seuEditText
. No entanto, esse ouvinte recebe apenas alguns eventos importantes . Por exemplo, se um usuário digitar 'wyw', o texto preditivo provavelmente recomendará 'eye'. Até que o usuário escolha 'wyw' ou 'eye', vocêOnKeyListener
não receberá um evento importante. Alguns podem preferir essa solução, mas achei frustrante. Eu queria todos os eventos principais, então tive a opção de filtrar ou não. A solução é aTextWatcher
. Basta criar e adicionarTextWatcher
a aoEditText
e passar aListAdapter
Filter
solicitação de filtro sempre que o texto for alterado. Lembre-se de remover oTextWatcher
inOnDestroy()
! Aqui está a solução final:fonte
executar o programa causará um fechamento forçado.
Troquei a linha:
com
poderia ser esse o problema? Para que serve o '@ + building_list'?
fonte
tive um problema com a filtragem, que os resultados foram filtrados, mas não restaurados !
antes de filtrar (início da atividade), criei um backup da lista. (apenas outra lista, contendo os mesmos dados)
na filtragem, o filtro e o listadapter são conectados à lista principal.
mas o próprio filtro usou os dados da lista de backups.
isso garantiu no meu caso, que a lista fosse atualizada imediatamente e, mesmo ao excluir os caracteres de termo de pesquisa, a lista é restaurada com êxito em todos os casos :)
obrigado por esta solução de qualquer maneira.
fonte