sábado, 10 de dezembro de 2011

Android - ListView Parte 6

Olá,

Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 6.

Hoje daremos sequência na parte 5, iremos ver como mudar a cor do listview, utilizar o AlertDialog e implementar mais performance no nosso custom Adapter.

O fonte será parecido com o último post.

Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:

Arquivo estados.java:
package br.com.empresa;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class list12 extends Activity {
    //Criamos uma lista de Estados baseados na classe Estado
    private List<estado> lstEstados;
    ListView list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  
        setContentView(R.layout.list12);
  
        list = (ListView) findViewById(R.id.ListView12);

        //Iniciamos a lista de Estados
        //no método add já inserimos um novo registro de cada Estados desejado
        lstEstados = new ArrayList<estado>();
        lstEstados.add(new Estado("Sao Paulo", "Sao Paulo", R.drawable.saopaulo));
        lstEstados.add(new Estado("Rio de Janeiro", "Rio de Janeiro", R.drawable.riodejaneiro));
        lstEstados.add(new Estado("Minas Gerais", "Belo Horizonte", R.drawable.minasgerais));
        lstEstados.add(new Estado("Rio Grande do Sul", "Porto Alegre", R.drawable.riograndedosul));
        lstEstados.add(new Estado("Santa Catarina", "Florianópolis", R.drawable.santacatarina));
        lstEstados.add(new Estado("Paraná", "Curitiba", R.drawable.parana));
        lstEstados.add(new Estado("Mato Grosso", "Cuiabá", R.drawable.matogrosso));
        lstEstados.add(new Estado("Amazonas", "Manaus", R.drawable.amazonas));

        //Criação do Adapter e passamos a nossa lista de Estados para ele
        EstadoAdapter adapter = new EstadoAdapter(this, lstEstados);

        //referenciamos a função que será invocada quando o usuário
        //clicar em algum item da lista
        list.setOnItemClickListener(onItemClick_List);
        
        list.setAdapter(adapter);
        
        //caso seja preciso adicionar mais algum item na lista você
        //pode utilizar também a forma abaixo
        adapter.addItem(new Estado("Bahia", "Salvador", R.drawable.bahia));
    }

        
    OnItemClickListener onItemClick_List = new OnItemClickListener() {
        public void onItemClick(AdapterView arg0, View view, int position, long index) {
            //Pegar o item clicado
            showToast("Você clicou no estado : " + lstEstados.get(position).getEstado());
        }
    };
 

    //Quando tecla no botão voltar o sistema irá apresentar
    //uma caixa de diálogo quetionando se realmente desej sair
    @Override 
    public void onBackPressed() {     
        AlertDialog.Builder builder = new AlertDialog.Builder(this);     
        builder.setMessage("Deseja sair?")            
        .setCancelable(false)        
        .setIcon(android.R.drawable.ic_dialog_alert) // ícone de alerta
        .setTitle("Atenção:") //título do caixa de diálogo
                
        //Evento disparado se clicar no botão Sim
        .setPositiveButton("Sim", new DialogInterface.OnClickListener() {               
            public void onClick(DialogInterface dialog, int id) {                     
                list12.this.finish(); //Fecha o Activity     
            }            
        })            
  
        //Event disparado se clicar no botão Não
        .setNegativeButton("Não", new DialogInterface.OnClickListener() {                
            public void onClick(DialogInterface dialog, int id) {                     
                dialog.cancel(); //Cancela a caixa de diálogo e volta a tela anterior
            }            
        });     
        AlertDialog alert = builder.create();     
        alert.show(); //Chama a caixa de diálogo
    }  
 
 
    private void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }     
}


Arquivo EstadoAdapter.java:
package br.com.empresa;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class EstadoAdapter extends BaseAdapter{
    private List<estado> listEstados;
    Context context;

    //Classe utilizada para instanciar os objetos do XML
    private LayoutInflater inflater;
    
    public EstadoAdapter(Context context, List<estado> plistEstados) {
        this.listEstados = plistEstados;
        this.context = context;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(final Estado item) {
        this.listEstados.add(item);
        //Atualizar a lista caso seja adicionado algum item
        notifyDataSetChanged();
    }    
    
    @Override
    public int getCount() {
        return listEstados.size();
    }

    @Override
    public Object getItem(int position) {
        return listEstados.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        
        Estado estadoVO = listEstados.get(position);

        //O ViewHolder irá guardar a instâncias dos objetos do estado_row
        ViewHolder holder;
  
        //Quando o objeto convertView não for nulo nós não precisaremos inflar
        //os objetos do XML, ele será nulo quando for a primeira vez que for carregado
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.estado_row, null);
   
            //Cria o Viewholder e guarda a instância dos objetos
            holder = new ViewHolder();
            holder.bandeira = (ImageView) convertView.findViewById(R.id.bandeira);
            holder.tvEstado = (TextView) convertView.findViewById(R.id.tvEstado);
            holder.tvCapital = (TextView) convertView.findViewById(R.id.tvCapital);
   
            convertView.setTag(holder);
        } else {
            //pega o ViewHolder para ter um acesso rápido aos objetos do XML
            //ele sempre passará por aqui quando,por exemplo, for efetuado uma rolagem na tela 
            holder = (ViewHolder) convertView.getTag();
        }

        holder.bandeira.setImageResource(estadoVO.getBandeira());
        holder.tvEstado.setText(estadoVO.getEstado());
        holder.tvCapital.setText(estadoVO.getCapital());

        return convertView;

    }
 
    //Criada esta classe estática para guardar a referência dos objetos abaixo
    static class ViewHolder {
        public ImageView bandeira;
        public TextView tvEstado;
        public TextView tvCapital;
    }
}

Abaixo segue o código fonte do arquivo estados.xml:
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ListView 
        android:id="@+id/ListView12" 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent">
    </ListView>
</LinearLayout>


Abaixo segue o código fonte do arquivo estado_row.xml:
Atenção: neste arquivo abaixo você fará referência a o outros dois arquivos (list_gb.xml e text_bg.xml) através das propriedades android:background="@color/list_bg" e style="@style/FontBold"
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout 
    android:background="@color/list_bg" 
    android:id="@+id/LinearLayout01" 
    android:layout_height="wrap_content" 
    android:layout_margintop="10dp" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android">
        <RelativeLayout 
            android:id="@+id/LinearLayout02" 
            android:layout_height="wrap_content" 
            android:layout_marginbottom="3dp" 
            android:layout_margintop="3dp" 
            android:layout_width="fill_parent">
            <ImageView 
                android:focusable="false" 
                android:id="@+id/bandeira" 
                android:layout_height="wrap_content" 
                android:layout_width="wrap_content" 
                android:src="@drawable/icon"/>                  
            <TextView 
                style="@style/FontBold"
                android:id="@+id/lblEstado" 
                android:layout_torightof="@+id/bandeira" 
                android:text="Estado : "/>
            <TextView 
                style="@style/FontBold"
                android:id="@+id/tvEstado" 
                android:layout_torightof="@+id/lblEstado" 
                android:text="nome do estado"/>
            <TextView 
                style="@style/FontPadrao"                
                android:id="@+id/lblCapital" 
                android:layout_below="@+id/lblEstado" 
                android:layout_torightof="@+id/bandeira" 
                android:text="Capital : "/>
            <TextView 
                style="@style/FontPadrao"
                android:id="@+id/tvCapital" 
                android:layout_below="@+id/lblEstado" 
                android:layout_torightof="@+id/lblCapital" 
                android:text="nome da capital"/>
        </ImageView>
    </RelativeLayout>
</LinearLayout>

Abaixo segue o código fonte do arquivo list_bg.xml (este arquivo deverá ficar na pasta res\color):
<?xml version="1.0" encoding="utf-8"?>  
     
    <item 
        android:drawable="@color/white" 
        android:state_pressed="false" 
        android:state_selected="false"/>      
    <item 
        android:drawable="@color/black" 
        android:state_pressed="true"/>      
    <item 
        android:drawable="@color/black" 
        android:state_pressed="false" 
        android:state_selected="true"/>    
 


Abaixo segue o código fonte do arquivo text_bg.xml (este arquivo deverá ficar na pasta res\color):
<?xml version="1.0" encoding="utf-8"?>  
     
    <item 
        android:color="@color/black" 
        android:state_pressed="false" 
        android:state_selected="false"/>
    <item 
        android:color="@color/white" 
        android:state_pressed="true"/>      
    <item 
        android:color="@color/white" 
        android:state_pressed="false" 
        android:state_selected="true"/>    
 

Abaixo segue o código fonte do arquivo styles.xml (este arquivo deverá ficar na pasta res\values):
<?xml version="1.0" encoding="utf-8"?>  
<resources>
    <style name="FontBold" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">wrap_content
        <item name="android:layout_height">wrap_content
        <item name="android:textStyle">bold
        <item name="android:focusable">false
        <item name="android:typeface">sans 
        <item name="android:textSize">16sp
        <item name="android:textColor">@color/text_bg  
    </style>
    <style name="FontPadrao" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">wrap_content
        <item name="android:layout_height">wrap_content
        <item name="android:focusable">false
        <item name="android:typeface">sans 
        <item name="android:textSize">13sp
        <item name="android:textColor">@color/text_bg
    </style>
</resources> 

Abaixo segue o código fonte do arquivo colors.xml (deverá ficar na pasta res\values):
<?xml version="1.0" encoding="utf-8"?> 
<resources>     
    <color name="white">#fff</color>     
    <color name="black">#000</color>     
    <color name="red">#c6360a</color>     
    <color name="green">#688f2b</color>     
    <color name="orange">#f48905</color>     
    <color name="dark_blue">#003366</color>         
    <color name="grey">#888888</color> 
</resources> 

Os arquivos acima serão os responsáveis por mudar a cor listview e dos textview que ele possui, ele deverão ficar na pasta res\color, conforme figura abaixo:


Abaixo segue o resultado de nosso programa:
ListView

ListView


Abaixo segue algumas dicas para melhor entendimento do fonte:

  1. Arquivo style.xml - atributos dos textview que utilizamos em nosso fonte
  2. Arquivo list_bg.xml - definição de cores do nosso listview
  3. Arquivo text_bg.xml - definição das cores dos textview utilizados no arquivo estado_row.xml
  4. Utilização da classe ViewHolder no arquivo EstadoAdapter.java para aumentar a performance ao carregar os itens da lista.
  5. Utilização da classe AlertDialog para exibir ao usuário a opção de escolher entre duas ações.


Por enquanto é isso espero que tenham gostado e em breve estarei postando mais discas e tutoriais sobre listview e layout.



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!

quinta-feira, 8 de dezembro de 2011

Android - ListView Parte 5

Olá,

Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 5.

Hoje iremos ver como criar um listview com ícone e mais de uma linha de texto para cada registro do ListView.

Nesse caso precisaremos criar um BaseAdapter customizado que irá receber uma lista de Estados e criar dois arquivos de layout XML, um sendo o principal que conterá as linha da lista e o outro sendo as próprias linhas da lista.

Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:

Arquivo estados.java:
package br.com.empresa;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class estados extends Activity {
    //Criamos uma lista de Estados baseados na classe Estado
    private List<estado> lstEstados = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.estados);
        
        ListView list = (ListView) findViewById(R.id.ListView12);

        //Iniciamos a lista de Estados
        //no método add já inserimos um novo registro de cada Estados desejado
        lstEstados = new ArrayList<estado>();
        lstEstados.add(new Estado("Sao Paulo", "Sao Paulo", R.drawable.saopaulo));
        lstEstados.add(new Estado("Rio de Janeiro", "Rio de Janeiro", R.drawable.riodejaneiro));
        lstEstados.add(new Estado("Minas Gerais", "Belo Horizonte", R.drawable.minasgerais));
        lstEstados.add(new Estado("Rio Grande do Sul", "Porto Alegre", R.drawable.riograndedosul));
        lstEstados.add(new Estado("Santa Catarina", "Florianópolis", R.drawable.santacatarina));
        lstEstados.add(new Estado("Paraná", "Curitiba", R.drawable.parana));
        lstEstados.add(new Estado("Mato Grosso", "Cuiabá", R.drawable.matogrosso));
        lstEstados.add(new Estado("Amazonas", "Manaus", R.drawable.amazonas));

        //Criação do Adapter e passamos a nossa lista de Estados para ele
        EstadoAdapter adapter = new EstadoAdapter(this, lstEstados);

        //referenciamos a função que será invocada quando o usuário
        //clicar em algum item da lista
        list.setOnItemClickListener(onItemClick_List);
    
        list.setAdapter(adapter);
    
        //caso seja preciso adicionar mais algum item na lista você
        //pode utilizar também a forma abaixo
        adapter.addItem(new Estado("Bahia", "Salvador", R.drawable.bahia));
    }

    OnItemClickListener onItemClick_List = new OnItemClickListener() {
        public void onItemClick(AdapterView arg0, View view, int position, long index) {
            //Pegar o item clicado
            showToast("Você clicou no estado : " + lstEstados.get(position).getEstado());
        }
    };
    
    private void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }        
}

Arquivo Estado.java (classe POJO):
package br.com.empresa;

public class Estado {
    private String estado;
    private String capital;
    private int bandeira;

    public Estado(String estado, String capital, int bandeira) {
        super();
        this.estado = estado;
        this.capital = capital;
        this.bandeira = bandeira;
    }

    public String getEstado() {
        return estado;
    }
    public void setEstado(String estado) {
        this.estado = estado;
    }
    public String getCapital() {
        return capital;
    }
    public void setCapital(String capital) {
        this.capital = capital;
    }
    public int getBandeira() {
        return bandeira;
    }
    public void setBandeira(int bandeira) {
        this.bandeira = bandeira;
    }
}

Arquivo EstadoAdapter.java:
package br.com.empresa;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class EstadoAdapter extends BaseAdapter{
    private List<estado> listEstados;

    //Classe utilizada para instanciar os objetos do XML
    private LayoutInflater inflater;
    
    public EstadoAdapter(Context context, List<estado> plistEstados) {
        this.listEstados = plistEstados;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(final Estado item) {
        this.listEstados.add(item);
        //Atualizar a lista caso seja adicionado algum item
        notifyDataSetChanged();
    }    
    
    @Override
    public int getCount() {
        return listEstados.size();
    }

    @Override
    public Object getItem(int position) {
        return listEstados.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        //Pega o registro da lista e trasnfere para o objeto estadoVO
        Estado estadoVO = listEstados.get(position);
        
        //Utiliza o XML estado_row para apresentar na tela
        convertView = inflater.inflate(R.layout.estado_row, null);
        
        //Instância os objetos do XML
        ImageView bandeira = (ImageView)convertView.findViewById(R.id.bandeira);
        TextView tvEstado = (TextView)convertView.findViewById(R.id.tvEstado);
        TextView tvCapital = (TextView)convertView.findViewById(R.id.tvCapital);
            
        //pega os dados que estão no objeto estadoVO e transfere para os objetos do XML
        bandeira.setImageResource(estadoVO.getBandeira());
        tvEstado.setText(estadoVO.getEstado());
        tvCapital.setText(estadoVO.getCapital());
        
        return convertView;
    }
}

Abaixo segue o código fonte do arquivo estados.xml:
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ListView 
        android:id="@+id/ListView12" 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent">
    </ListView>
</LinearLayout>


Abaixo segue o código fonte do arquivo estado_row.xml:
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout 
    android:id="@+id/LinearLayout01" 
    android:layout_height="wrap_content" 
    android:layout_margintop="10dp" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <RelativeLayout 
        android:id="@+id/LinearLayout02" 
        android:layout_height="wrap_content" 
        android:layout_marginbottom="3dp" 
        android:layout_margintop="3dp" 
        android:layout_width="fill_parent">
        <ImageView 
            android:focusable="false" 
            android:id="@+id/bandeira" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:src="@drawable/icon">                        
        </ImageView>
        <TextView 
            android:id="@+id/lblEstado" 
            android:layout_height="wrap_content" 
            android:layout_torightof="@+id/bandeira" 
            android:layout_width="wrap_content" 
            android:text="Estado : " 
            android:textsize="16sp" 
            android:textstyle="bold">
        </TextView>
        <TextView 
            android:focusable="false" 
            android:id="@+id/tvEstado" 
            android:layout_height="wrap_content" 
            android:layout_torightof="@+id/lblEstado" 
            android:layout_width="wrap_content" 
            android:text="nome do estado" 
            android:textsize="16sp" 
            android:textstyle="bold">
        </TextView>
        <TextView 
            android:focusable="false" 
            android:id="@+id/lblCapital" 
            android:layout_below="@+id/lblEstado" 
            android:layout_height="wrap_content" 
            android:layout_torightof="@+id/bandeira" 
            android:layout_width="wrap_content" 
            android:text="Capital : " 
            android:textsize="13sp" 
            android:textstyle="bold">
        </TextView>
        <TextView 
            android:focusable="false" 
            android:id="@+id/tvCapital" 
            android:layout_below="@+id/lblEstado" 
            android:layout_height="wrap_content" 
            android:layout_torightof="@+id/lblCapital" 
            android:layout_width="wrap_content" 
            android:text="nome da capital" 
            android:textsize="13sp">
        </TextView>
    </RelativeLayout>
</LinearLayout>

Abaixo seguem as figuras que foram utilizadas no sistema na pasta res\drawable-ldpi:


Abaixo segue o resultado do nosso sistema:
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!

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!

quinta-feira, 1 de dezembro de 2011

Android - ListView Parte 3

Olá,

Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 3.

O exemplo de hoje será uma variação da parte 2, onde será criado um ListView com alguns estados brasileiros com múltipla escolha, a diferença está por conta do layout, que terá fixo no rodapé dois botões, que irão informar ao usuário quais estados foram marcados e quais não foram marcados.

Vamos por logo a mão na massa, abaixo segue o código fonte do arquivo lista3.java:

package br.com.empresa;

import android.app.Activity;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class list3 extends Activity {
    private String[] lstEstados;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista3);

        listView = (ListView) findViewById(R.id.lista3);
        
        //Criar um array de String
        lstEstados = new String[] {"São Paulo", "Rio de Janeiro", "Minas Gerais", "Rio Grande do Sul", "Santa Catarina", "Paraná", "Mato Grosso", "Amazonas"};

        //Criar um ArrayAdapter do tipo String, que vai fazer aparecer as Strings acima
        //em seu ListView do tipo que checked
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
            android.R.layout.simple_list_item_checked, lstEstados);
        
        //Associar o adapter ao listview
        listView.setAdapter(adapter);
    }

    //Este evento foi definido no arquivo de layout xml
    public void btnMarcados_click(View view){
        String lstrEstadosSelecionados = "";

        //Cria um array com os itens selecionados no listview
        SparseBooleanArray checked = listView.getCheckedItemPositions();

        for (int i = 0; i < checked.size(); i++){
            //pega os itens marcados
            lstrEstadosSelecionados += lstEstados[checked.keyAt(i)] + ",";
        }
        Toast.makeText(this, "Estados marcados : " + lstrEstadosSelecionados, Toast.LENGTH_LONG).show();
    }

    //Este evento foi definido no arquivo de layout xml
    public void btnDesmarcados_click(View view){
        String lstrEstadosSelecionados = "";

        for (int i = 0; i < listView.getCount(); i++){
            //pega os itens desmarcados
            if (listView.isItemChecked(i) == false){
                lstrEstadosSelecionados += lstEstados[i] + ",";
            }
        }
        Toast.makeText(this, "Estados desmarcados : " + lstrEstadosSelecionados, Toast.LENGTH_LONG).show();
    }    
}

Para esse exemplo será necessário criar um arquivo de layout, até porque estaremos incluindo dois botões nesse layout e eles ficarão fixos no rodapé do layout.

Abaixo segue o código fonte do arquivo lista3.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ListView 
        android:choiceMode="multipleChoice" 
        android:id="@+id/lista3" 
        android:layout_above="@+id/buttons" 
        android:layout_alignParentTop="true" 
        android:layout_height="fill_parent" 
        android:layout_width="fill_parent"/>

    <LinearLayout 
        android:id="@+id/buttons" 
        android:layout_alignParentBottom="true" 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:orientation="horizontal">

        <Button 
            android:id="@+id/btnMarcados" 
            android:layout_height="wrap_content" 
            android:layout_weight="50" 
            android:layout_width="fill_parent" 
            android:onClick="btnMarcados_click" 
            android:text="Marcados"/>

        <Button 
            android:id="@+id/btnDesmarcados" 
            android:layout_height="wrap_content" 
            android:layout_weight="50" 
            android:layout_width="fill_parent" 
            android:onClick="btnDesmarcados_click" 
            android:text="Desmarcados"/>

    </LinearLayout>
</RelativeLayout>


Para explicação do layout xml acima temos o seguinte:
  • Criamos um LinearLayout com 2 botões dentro de um RelativeLayout que contém o ListView
  • ListView android:choiceMode="multipleChoice" - Informamos que teremos seleção em nossa lista
  • ListView android:layout_alignParentTop="true"  - O ListView ficará alinhado no topo de nosso xml
  • Button android:onClick="btnMarcados_click" - Dizemos qual função irá receber o evento click do botão
  • Button android:layout_weight="50" - Dizemos que o tamanho do botão será de 50% da tela

Como resultado final teremos a seguinte tela:
ListView

Em breve estarei postando mais opções relacionadas a layout e listview.

Desenv com qualidade!

Android - Calculadora - programa com código fonte

Olá,

O projeto a seguir é um exemplo muito simples de uma calculadora apenas para fins didáticos, este projeto eu irei utilizar em um Curso de Extensão que irei ministrar em 2012 na Universidade de Franca - UniFran.

Nele serão abordados alguns pontos interessantes para iniciantes abaixo segue uma lista deles:

  • Layout landscape e portrait 
  • Evento click para botões
  • Tratamento de erro
  • Conversão de valores (String para Double)

Abaixo segue o fonte do arquivo CalculadoraActivity.java o fonte está todo comentado para melhor entendimento.

package br.com.CursoExt;

import java.text.NumberFormat;

import br.com.CursoExt.R.id;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class CalculadoraActivity extends Activity implements OnClickListener {
    
  
 // Definição dos objetos e variáveis modulares que 
 // serão utilizados dentro da classe
 
    EditText primeiro;
    EditText segundo;
    EditText resultado;
    Button btnSomar;
    Button btnSubtrair;
    Button btnMultiplicar;
    Button btnDividir;
    Double result = (double)0; 

    // Chamada quando a activity é criada pela primeira vez
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //
         // Associa um arquivo de layout a esta classe
         //
        setContentView(R.layout.main);
        
        try{
            // 
            // Instanciando os objetos de acordo com o layout XML 
            // definido no arquivo main.xml
            //
            primeiro = (EditText)findViewById(R.id.edNumero1);
            segundo = (EditText)findViewById(R.id.edNumero2);
            resultado = (EditText)findViewById(R.id.edResultado);
            btnSomar = (Button)findViewById(id.btnSomar);
            btnSubtrair = (Button)findViewById(id.btnSubtrair);
            btnMultiplicar = (Button)findViewById(id.btnMultiplicar);
            btnDividir = (Button)findViewById(id.btnDividir);
         
            // 
            // Associando o evento OnClickListener de cada um dos botões 
            // a uma fução específica
            //
            btnSomar.setOnClickListener(onClick_btnSomar);
            btnSubtrair.setOnClickListener(onClick_btnSubtrair);
            btnMultiplicar.setOnClickListener(onClick_btnMultiplicar);
            btnDividir.setOnClickListener(onClick_btnDividir);
        }
        catch (Exception e) {
            // Tratamento de erro 
            Mensagem(e.getMessage());
        }
    }

    // Cria um anonymous implementation para OnClickListener 
    OnClickListener onClick_btnSomar = new OnClickListener() {    
        public void onClick(View v) {
            try
            {
                result = getDouble(primeiro.getText().toString()) + getDouble(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnSomar");
                //Gravar no LogCat uma informação para auxiliar 
                //no processo de desenvolvimento e correção de bugs
                Log.i("Somar", "clicou no botão Somar");
            }
            catch (Exception e) {
                //Gravar no LogCat o erro ocorrido
                TrataErro(e, "Botão Somar");
            }
        }
    };    

    OnClickListener onClick_btnSubtrair = new OnClickListener() {    
        public void onClick(View v){      
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) - Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnSubtrair");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Subtrair");
            }
        }
    };

    OnClickListener onClick_btnMultiplicar = new OnClickListener() {    
        public void onClick(View v) {      
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) * Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnMultiplicar");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Multiplicar");
            }
        }
    };    

    OnClickListener onClick_btnDividir = new OnClickListener() {    
     public void onClick(View v) { 
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) / Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnDividir");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Dividir");
            }
        }
    };    
    
    //
    // Desativando o botão voltar do aparelho
    //
    @Override
    public void onBackPressed() {
        return;
    }
 
    public void onClick_Sair(View v) {
        try
        {
            //
            // Criando uma caixa de diálogo para sair ou não do sistema
            //
            AlertDialog.Builder builder = new AlertDialog.Builder(this);     
            builder.setMessage("Você tem certeza que deseja sair?")            
                //informando o título da caixa de texto
                .setTitle("Atenção:")
                .setIcon(android.R.drawable.ic_menu_info_details) 
       
                //setCancelable = false
                //desabilita o botão Voltar com isso obrigando o usuário 
                //a selecionar um dos botões do AlertDialog
                .setCancelable(false)      
                .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        CalculadoraActivity.this.finish();
                    }            
                })           
                .setNegativeButton("Não", new DialogInterface.OnClickListener() { 
                    public void onClick(DialogInterface dialog, int id) { 
                        dialog.cancel();                
                    }            
                });     
            AlertDialog alert = builder.create();     
            alert.show();  
        }
        catch (Exception e) {
            Mensagem(e.getMessage());
        }
    }

    // 
    // Apresentar o resultado do cálculo no objeto "resultado"
    // através do método setText
    //
    private void MostraResultado()
    {
        String strResult = NumberFormat.getInstance().format(result);
        resultado.setText(strResult);
    }
 
    // 
    // Converter um valor String para Double
    // 
    private Double getDouble(String pValue)
    {
        if (pValue == null || pValue.length() == 0 || pValue.equals("."))
            return Double.valueOf(0);
        else
            return Double.parseDouble(pValue);
    }
 
    // 
    // Apresentar mensagem de erro ou informações oa usuário
    // 
    private void Mensagem(String pMens)
    {
        Toast.makeText(this, pMens, Toast.LENGTH_SHORT).show();
    }

    private void TrataErro(Exception e, String pMens)
    {
        Mensagem(e.getMessage());
        Log.e(getString(R.string.app_name), pMens, e);
    }
}

Foram criados dois layout um para o landscape e outro para o portrait, abaixo segue o layout portrait:

<?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">

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o primeiro número"/>

    <EditText 
        android:id="@+id/edNumero1" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o segundo número"/>
        
    <EditText 
        android:id="@+id/edNumero2" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Operações:"/>
    
    <Button 
        android:id="@+id/btnSomar" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Somar"/>

    <Button 
        android:id="@+id/btnSubtrair" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Subtrair"/>

    <Button 
        android:id="@+id/btnDividir" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Dividir"/>

    <Button 
        android:id="@+id/btnMultiplicar" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Multiplicar"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Resultado:"/>
    
    <EditText 
        android:id="@+id/edResultado" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent"/>

</LinearLayout>

E a seguir o layout landscape:

<?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">

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o primeiro número"/>

    <EditText 
        android:id="@+id/edNumero1" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o segundo número"/>
        
    <EditText 
        android:id="@+id/edNumero2" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Operações:"/>

    <LinearLayout 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:orientation="horizontal">    
    
        <Button 
            android:id="@+id/btnSomar" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Somar"/>

        <Button 
            android:id="@+id/btnSubtrair" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Subtrair"/>

        <Button 
            android:id="@+id/btnDividir" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Dividir"/>

        <Button 
            android:id="@+id/btnMultiplicar" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Multiplicar"/>
    
    </LinearLayout>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Resultado:"/>
    
    <EditText 
        android:id="@+id/edResultado" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent"/>
        
</LinearLayout>

Para criação dos dois layouts será necessário criar uma pasta chamada layout-land dentro da pasta res, conforme figura abaixo:


Abaixo segue um print de como ficou nossa calculadora:


Repare a diferença de layout nos botões entre as duas visões graças a inclusão dos dois arquivos main.xml, ou seja, um para cada layout.

Por enquanto é isso, é um projeto bem simples, mas que acredito que servirá para muitos no aprendizado.


Desenv com qualidade!