terça-feira, 6 de dezembro de 2011

Android - ListView Parte 4

Olá,

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.



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:

João Gabriel Brene disse...

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

Leandro disse...

Nesta parte:
"Abaixo segue o código fonte do arquivo style.xml (deverá ficar na pasta res\values):"

faltou o em baixo, não?

Marcio de Souza disse...
Este comentário foi removido pelo autor.
Marcio de Souza disse...

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!

Gustavo Appel disse...

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

hugoc disse...

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

hugoc disse...
Este comentário foi removido pelo autor.
Ivan disse...

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.

Ivan disse...
Este comentário foi removido pelo autor.
Frederico Brigatte disse...

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?

SMarques disse...

Olha como que eu faço isso, mais fazendo uma busca com o SQLITE!!!sarylsonmarques@gmail.com

Unknown disse...

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á!!!!