Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 4.
O exemplo de hoje será mostrado como podemos efetuar uma busca em um listview (search listview), esse recurso é bem interessante quando você já possui uma coleção de dados carregados em seu list e quer efetuar uma busca em cima desta lista.
Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:
Arquivo consulta.java
package br.com.empresa; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class consulta extends Activity { private ListView lv; private EditText et; private String[] lstEstados; private ArrayList<String> lstEstados_Encontrados = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.consulta); lv = (ListView) findViewById(R.id.lvEstados); et = (EditText) findViewById(R.id.etProcurar); lstEstados = new String[] {"São Paulo", "Rio de Janeiro", "Minas Gerais", "Rio Grande do Sul", "Santa Catarina", "Paraná", "Mato Grosso", "Amazonas"}; //Carrega o listview com todos os itens lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lstEstados)); CarregarEncontrados(); //Adiciona um TextWatcher ao TextView cujos métodos são chamados sempre //que este TextView sofra alterações. et.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { // Abstract Method of TextWatcher Interface. } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // Abstract Method of TextWatcher Interface. } //Evento acionado quando o usuário teclar algo //na caixa de texto "Procurar" public void onTextChanged(CharSequence s, int start, int before, int count) { CarregarEncontrados(); //Carrega o listview com os itens encontrados lv.setAdapter(new ArrayAdapter<String>(consulta.this, android.R.layout.simple_list_item_1, lstEstados_Encontrados)); } }); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View view, int position, long index) { Mensagem("Você clicou no estado : " + lstEstados_Encontrados.get(position).toString()); } }); } public void CarregarEncontrados() { int textlength = et.getText().length(); //Limpa o array com os estados encontrados //para poder efetuar nova busca lstEstados_Encontrados.clear(); for (int i = 0; i < lstEstados.length; i++) { if (textlength <= lstEstados[i].length()) { //Verifica se existe algum item no array original //caso encontre é adicionado no array de encontrados if(et.getText().toString().equalsIgnoreCase((String)lstEstados[i].subSequence(0, textlength))) { lstEstados_Encontrados.add(lstEstados[i]); } } } } private void Mensagem(String msg) { Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show (); } }
Abaixo segue o código fonte do arquivo consulta.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <EditText android:hint="Procurar" android:id="@+id/etProcurar" android:layout_height="wrap_content" android:layout_width="fill_parent"> </EditText> <ListView android:id="@+id/lvEstados" android:layout_height="wrap_content" android:layout_width="fill_parent"> </ListView> </LinearLayout>
O segredo (se é que tem) deste fonte está no evento onTextChanged que é disparado toda vez que o usuário digita alguma coisa na caixa de texto de busca e com isso efetuamos um loop no array de estados e verificamos se oque o usuário digitou existem em algum dos itens, caso tenha adicionamos no array de "encontrados" e em seguida carreamos nosso adapter com esse array de encontrados.
Como resultado temos as imagens a seguir, mostrando a tela inicial e quando o usuário digitar alguma coisa na caixa de texto:
ListView |
ListView |
Em breve estarei postando mais opções relacionadas a layout e listview.
Parte 2 : http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html
Parte 3 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html
Parte 5 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html
Parte 6 : http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html
Parte 7 : http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html
Parte 8 : http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html
Parte 3 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html
Parte 5 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html
Parte 6 : http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html
Parte 7 : http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html
Parte 8 : http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html
Trabalhando com Banco de Dados SQLite:
http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html
Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.
Desenv com qualidade!
12 comentários:
Olá Felipe,
Sou sócio na produtora 3D, 3Dfit. Trabalhamos basicamente com desenvolvimento de mídias digitais 3D. Estamos com um projeto de iniciar em 2012 o desenvolvimento de aplicativos e jogos 3D para mobiles.
Estamos atualmente com duas propostas de aplicativos para serem comercializados na apple store e na Android market. Esses dois projetos tem todo o layout e desenvolvimento gráfico elaborado.
O que estamos procurando hoje é alguem que tenha conhecimento sênior em aplicativos e mobiles para entrar com a parte de programação dos games e dos aplicativos.
Gostaria de saber se você tem interesse em entrar como parceiro nesses projetos e quem sabe em projetos futuros.
Estou no aguardo de um retorno.
Desde já agradeço.
Att,
João Gabriel Brene
joao_gabriel@3dfit.com.br
Nesta parte:
"Abaixo segue o código fonte do arquivo style.xml (deverá ficar na pasta res\values):"
faltou o em baixo, não?
Olá, Leandro
Fiz uma revisão nos fontes, alterei algumas coisinha que não estavam legais com, por exemplo, letras maiúsculas e minúsculas, mas não entendi a sua dúvida e imagino também que seja referente ao "Android - Listview parte 6"
Se puder explicar um pouco mais ficarei feliz em poder ajudar.
Obrigado!
Olá Marcio, gostaria de saber se há como e se há algum exemplo de como fazer esse mesmo exemplo usando nomes e sobrenomes, mas que por exemplo no filtro possa-se digitar o sobrenome e na lista mostrar os nomes correspondentes, mesmo que seja um ou mais.
Obrigado
ola primeiramente queria parabeniza-lo pelos belos post que vc tem feito do android. Sou novato na programaçao android e analisando esse exemplo seu.. vi que a busca so funciona de buscar pelo inicio da string. Exemplo
Rio de Janeiro e Rio grande do sul...
estes dois estados so aparecem se eu digitar RIO...
se eu digitar DE ele nao busca..
a pergunta é: tem como fazer com que a busca ocorra tanto no incio qto no meio ou no final da string?
exemplo se eu buscar a letra A ele teria que me mostrar todos estados com letra A
abs
Para quem ficou com a mesma dúvida do hugoc e bem simples substitua o método 'equalsIgnoreCase' por 'contains' e ele irá buscar por qualquer parte da palavra.
Boa noite a todos. Ótimo post. Como fazer utilizando dados vindo do SQLite? Já tenho a lista populada utilizando:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, clientes, new String[] {DbAdapter.KEY_NOME, DbAdapter.KEY_CELULAR}, new int[] {android.R.id.text1, android.R.id.text2});
Como adaptar o código para dados vindo do banco?
Olha como que eu faço isso, mais fazendo uma busca com o SQLITE!!!sarylsonmarques@gmail.com
Ola amigo, muito obrigado por ter postado este artigo me ajudou muito a entender as listas, mas tenho uma pequena duvida, estou me matando e nao consigo fazer, eu queria que cada ITEM da lista que clica-se abrise uma outra tela, como é que eu implementaria isso neste codigo que vc escreveu???
Obrigadado desde já!!!!
Postar um comentário