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