sexta-feira, 7 de dezembro de 2012

Android – Aprendendo a utilizar o ListView



Olá amigos do The Club, estou de volta com artigos relacionados ao Sistema Android. Apresentarei o “ListView”, sendo um dos componentes  mais utilizados e importantes desta plataforma pelo fato de possibilitar a implementação de funções ligadas ao Banco de Dados, classes ou qualquer coleção de dados.
A documentação On-Line para o desenvolvedor Android descreve o ListView como um grupo de exibição que mostra uma lista de itens com possibilidade de rolagem. Os itens da lista são automaticamente inseridos usando um adaptador que utiliza o conteúdo de uma fonte (uma consulta qualquer ou com banco de dados), convertendo cada item resultando em uma visão que por fim é mostrado ao usuário final.
Este artigo possuirá dois exemplos, o primeiro utilizando a classe ArrayAdapter e o segundo faremos uma pequena implementação nesta classe para personalizar e montar um layout desejado pelo desenvolvedor. Seguiremos os mesmos passos descritos nos artigos anteriores, crie um novo Projeto em Android, defina o nome da atividade principal como “menuescolherAtividade”.

Criando a Classe Clientes

Os dados utilizados para testes nestes exemplos serão oriundos de uma classe com alguns atributos, ou seja, não teremos nenhum Banco de Dados. É importante entender que a origem dos dados não importa neste processo. A estrutura será da seguinte maneira:

Campo
Tipo
Id_Cliente
Integer
Nome
String
Tipo_Pessoa
String
Cnpj_Cpf
String
Email
String
Situacao
String

Para criar uma classe clique com o botão direito sobre o pacote principal escolha “New/Class” definindo como “Clientes.java”. Esta classe possuirá todas as propriedades descritas anteriormente com seus métodos “Getters and Setters”. Para criar estes métodos automaticamente, clique com o botão direito e escolha “Source/Generate Getters and Setters”. Este recurso do Eclipse possibilita a automatização de vários processos, incluindo este. Ver Imagem 01.

Figura 01: Geração automática dos Métodos “Getters and Setters”.   

package pct.Android_ListView;

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

public class Clientes
{
     private int Id_Cliente;
     private String Nome;
     private String Tipo_Pessoa;
     private String Cnpj_Cpf;
     private String Email;
     private String Situacao;
         
     public int getId_Cliente()
     {
         return Id_Cliente;
     }

     public void setId_Cliente(int id_Cliente)
     {
         Id_Cliente = id_Cliente;
     }

     public String getNome()
     {
         return Nome;
     }

     public void setNome(String nome)
     {
         Nome = nome;
     }

     public String getTipo_Pessoa()
     {
         return Tipo_Pessoa;
     }

     public void setTipo_Pessoa(String tipo_Pessoa)
     {
         Tipo_Pessoa = tipo_Pessoa;
     }

     public String getCnpj_Cpf()
     {
         return Cnpj_Cpf;
     }

     public void setCnpj_Cpf(String cnpj_Cpf)
     {
         Cnpj_Cpf = cnpj_Cpf;
     }

     public String getEmail()
     {
         return Email;
     }

     public void setEmail(String email)
     {
         Email = email;
     }

     public String getSituacao()
     {
         return Situacao;
     }

     public void setSituacao(String situacao)
     {
         Situacao = situacao;
     }
    
     public Clientes()
     {
        
     }

     public List<Clientes> ListarClientes()
     {
List<Clientes> lista_cliente = new ArrayList<Clientes>();
                  
         Clientes cliente = new Clientes();
         cliente.setId_Cliente(1);
         cliente.setNome("Thiago Montebugnoli");
         cliente.setEmail("thiago@theclub.com.br");
         cliente.setCnpj_Cpf("366.999.888-99");
         cliente.setTipo_Pessoa("F");
         cliente.setSituacao("1");
         lista_cliente.add(cliente);
        
         Clientes cliente1 = new Clientes();
         cliente1.setId_Cliente(2);
         cliente1.setNome("Marcos Cesar Silva");
         cliente1.setEmail("marcos@theclub.com.br");
         cliente1.setCnpj_Cpf("166.999.888-99");
         cliente1.setTipo_Pessoa("F");
         cliente1.setSituacao("1");
         lista_cliente.add(cliente1);
        
         Clientes cliente2 = new Clientes();
         cliente2.setId_Cliente(3);
         cliente2.setNome("Bruno");
         cliente2.setEmail("bruno@theclub.com.br");
         cliente2.setCnpj_Cpf("222.222.888-99");
         cliente2.setTipo_Pessoa("J");
         cliente2.setSituacao("1");
         lista_cliente.add(cliente2);
        
         Clientes cliente3 = new Clientes();
         cliente3.setId_Cliente(4);
         cliente3.setNome("Vitor");
         cliente3.setEmail("vitor@theclub.com.br");
         cliente3.setCnpj_Cpf("999.999.999-99");
         cliente3.setTipo_Pessoa("J");
         cliente3.setSituacao("0");
         lista_cliente.add(cliente3);
        
         Clientes cliente4 = new Clientes();
         cliente4.setId_Cliente(5);
         cliente4.setNome("Eduardo");
         cliente4.setEmail("eduardo@theclub.com.br");
         cliente4.setCnpj_Cpf("366.999.888-99");
         cliente4.setTipo_Pessoa("F");
         cliente4.setSituacao("0");
         lista_cliente.add(cliente4);
        
         Clientes cliente5 = new Clientes();
         cliente5.setId_Cliente(6);
         cliente5.setNome("The Club");
         cliente5.setEmail("suporte@theclub.com.br");
         cliente5.setCnpj_Cpf("41.789.789.0001/05");
         cliente5.setTipo_Pessoa("J");
         cliente5.setSituacao("1");
         lista_cliente.add(cliente5);
        
         Clientes cliente6 = new Clientes();
         cliente6.setId_Cliente(7);
         cliente6.setNome("Datasmart");
         cliente6.setEmail("datarmart@theclub.com.br");
         cliente6.setCnpj_Cpf("99.888.898.0001/01");
         cliente6.setTipo_Pessoa("J");
         cliente6.setSituacao("0");
         lista_cliente.add(cliente6);
                  
         return lista_cliente;
     }
}

No método ListarClientes()  é onde alimento esta classe com alguns dados aleatórios e retorno em seguida uma Lista de clientes, ou seja, retorno um conjunto de dados para a Classe Clientes, a qual servirá de exemplo para o uso de nossos exemplos.

Criando a tela principal
Em “res/layout” crie um XML e defina o nome como “menuescolher.xml”. Aproveite também e adicione alguns componentes: Um textBox, dois RadioButtons, Um Button e um ListView. Ver Imagem 02 do Lay-Out Sugerido.

Figura 02: Tela Principal.

Segue também a estrutura XML Correspondente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:typeface="sans"
    android:id="@+id/txtPesquisar"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:layout_width="200dp"
    android:text="Escolher ListView:"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center">
    </TextView>
    <RadioGroup android:orientation="horizontal"
    android:id="@+id/rgEscolher"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:gravity="center"
    android:layout_gravity="center">
        <RadioButton android:checked="true"
        android:layout_width="wrap_content"
        android:typeface="sans"
        android:id="@+id/rbArrayAdapter"
        android:text="ArrayAdapter"
        android:layout_height="wrap_content">
        </RadioButton>
        <RadioButton android:layout_width="wrap_content"
        android:typeface="sans"
        android:id="@+id/rbTheClubAdapter"
        android:text="TheClubAdapter"
        android:layout_height="wrap_content">
        </RadioButton>
    </RadioGroup>
    <Button android:text="Listar Dados"
    android:onClick="Listar"
    android:id="@+id/btnListar"
    android:typeface="sans"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_width="120dp">
    </Button>
    <ListView android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="352dp"
    android:id="@+id/lstSimples">
    </ListView>
</LinearLayout>

Criando um exemplo simples

Na Atividade principal definida como: “menuescolherAtividade.java”, inicialmente importe algumas bibliotecas necessárias ao decorrer do desenvolvimento.

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RadioGroup;

public class menuescolherAtividade extends Activity
{
    RadioGroup rgEscolher;
    ListView lstView;

Criamos também algumas variáveis para serem inicializadas no evento “Oncreate()” da Atividade. O RadioGroup para escolher o tipo de visualização do ListView e o ListView que fará as devidas referências. 
   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menuescolher);
        InicializaListeners();
    }
     
No evento OnCreate() defina o Layout criado anteriormente e execute o método InicializaListeners(), o mesmo sendo responsável por atribuir os objetos às devidas variáveis.

       public void InicializaListeners()
      {
          rgEscolher = (RadioGroup) findViewById(R.id.rgEscolher);
          lstView = (ListView)  findViewById(R.id.lstSimples);
      }

        
      public void Listar(View v)
      {
          switch (rgEscolher.getCheckedRadioButtonId())
          {
              case R.id.rbArrayAdapter : ListarArrayAdapter();
             break;
                       
              case R.id.rbTheClubAdapter : ListarTheClubAdapter();
              break;
         }
      }
       
Já o método Listar() está ligado ao evento OnClick() do botão. Nesta rotina será feito um Switch/case para verificar qual RadioButton foi selecionado.

       public void ListarArrayAdapter()
      {
         Clientes clientes = new Clientes();
         List<Clientes> lista_clientes = clientes.ListarClientes();
        
         ArrayList<String> cli = new ArrayList<String>();
         for (int i = 0; i < lista_clientes.size(); i++)
         {
String Id_Cliente = String.valueOf(lista_clientes.get(i).getId_Cliente();
                   String Nome = lista_clientes.get(i).getNome();
                 cli.add(Id_Cliente + " - "+ Nome);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, android.R.id.text1, cli);
               lstView.setAdapter(arrayAdapter);
            }
      }
A função ListarArrayAdapter é a mais importante, pois é com ela que vamos atribuir os dados da classe Clientes ao ListView. Primeiramente instancie a classe Clientes e execute o método ListarClientes() atribuindo a uma variável do tipo List<Clientes>.  Aproveite para criar outra variável do tipo ArrayList que será responsável por armazenar nossos dados. Faremos um Loop para varrer os registros da variável lista_Clientes para obtermos o ID e o Nome concatenado utilizando o método get().
Armazenamos em uma variável do tipo ArrayAdapter<String>, passando por parâmetro: o contexto atual, o tipo de layout que teremos no ListView, o Tipo de Fonte utilizada e o ArrayList com os dados concatenados. Ao compilar e executar a aplicação, ela deverá ficar idêntica a Imagem 03.


Figura 03: Exemplo com ArrayAdapter.

Criando um exemplo personalizado

A Classe ArrayAdapter nos dá uma gama muito grande de possibilidades para implementar recursos personalizados ao ListView por exemplo. Nesta parte do artigo vou criar uma classe sobrescrevendo o método GetView(). Este método é o responsável por exibir os itens na tela, para isto vamos através dele criar um layout em XML específico para esta tarefa. Através deste arquivo vamos “Inflá-lo” e receber o resultado necessário. Dividiremos este processo em 3 etapas, sendo o primeiro responsável pela criação do Lay-Out, seguido pela Classe personalizada e sua devida utilização.

1 - Criando o “Lay-Out” personalizado 

Este lay-Out possuirá campos referentes ao Nome, Cnpf/Cpf, Email, Tipo de Pessoa e Situação do Cadastro. Para iniciar crie um arquivo XML e defina o nome como “theclubadaper.xml”, Adicionando 3 TextView, 2 RadioButtons e 1 CheckBox. Ver Imagem 04.

Figura 04: Lay-Out Sugerido.

A seguir o código XML correspondente.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="70dip"
    android:paddingTop="5dip"
    android:paddingBottom="5dip" android:orientation="vertical">
   <LinearLayout android:id="@+id/linearLayout1"
   android:layout_width="wrap_content"
   android:layout_height="match_parent"
   android:orientation="horizontal">
       <LinearLayout android:orientation="vertical"
       android:layout_width="135dp"
       android:layout_height="match_parent">
           <TextView android:id="@+id/txtNome"
           android:layout_width="match_parent"
           android:layout_height="20dp">
           </TextView>
           <TextView android:id="@+id/txtEmail"
           android:layout_width="match_parent"
           android:layout_height="20dp">
           </TextView>
           <TextView android:id="@+id/txtCnpjCpf"
           android:layout_width="match_parent"
           android:layout_height="20dp">
           </TextView>
       </LinearLayout>
       <LinearLayout android:gravity="center_vertical"
       android:orientation="horizontal"
       android:layout_width="wrap_content"
       android:layout_height="match_parent">
           <RadioGroup android:layout_width="wrap_content"
           android:orientation="horizontal"
           android:layout_height="wrap_content"
           android:layout_marginRight="15dip"
           android:id="@+id/radios">
               <RadioButton android:layout_height="wrap_content"
               android:text="Física"
               android:id="@+id/rbFisica"
               android:layout_width="wrap_content"
               android:textSize="8dip">
               </RadioButton>
               <RadioButton android:layout_height="wrap_content"
               android:text="Jurídica"
               android:id="@+id/rbJuridica"
               android:layout_width="wrap_content"
               android:textSize="8dip">
               </RadioButton>
           </RadioGroup>
       </LinearLayout>
       <LinearLayout android:gravity="right|center_vertical"
       android:orientation="vertical"
       android:layout_width="40dip"
       android:layout_height="50dp">
           <TextView android:id="@+id/txtStatus"
           android:textSize="8dip"
           android:textAppearance="?android:attr/textAppearanceSmall"
           android:layout_width="wrap_content"
           android:layout_gravity="center_horizontal"
           android:text="Ativo"
           android:layout_height="wrap_content">
           </TextView>
           <CheckBox android:layout_width="wrap_content"
           android:id="@+id/cxSituacao"
           android:layout_height="wrap_content">
           </CheckBox>
       </LinearLayout>
   </LinearLayout>
</LinearLayout>

2 - Criando a Classe “theclubAdapter.java”

Para criar a classe “theclubAdapter.java” siga os mesmos passos descritos anteriormente clicando com o botão direito no item  “New/Class”. Importe os pacotes necessários e em seguida faça a herança para a classe “ArrayAdapter<Clientes>” para implementar os métodos necessários. Segue o código fonte comentado.

package pct.Android_ListView;

import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.RadioButton;
import android.widget.TextView;

public class theclubadapter extends ArrayAdapter<Clientes>
{
    private final LayoutInflater inflater;
    private final int recursoId;

Variáveis utilizadas ao decorrer da implementação, sendo a primeira responsável por montar o Layout do ListView e a segunda sendo uma identificação do “theclubadapter.XML”.

public theclubadapter(Context context, int resource, List<Clientes> objects)
    {
       super(context, resource, objects);
       this.inflater = LayoutInflater.from(context);
       this.recursoId = resource;
    }

No constructor da classe passamos alguns parâmetros responsáveis respectivamente pelo Contexto, Identificação do Lay-out XML e a Lista contendo os dados dos Clientes.
     
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        Clientes cliente = getItem(position);
       convertView = inflater.inflate(recursoId, parent, false);
TextView txtNome = (TextView) convertView.findViewById(R.id.txtNome);
TextView txtEmail = (TextView) convertView.findViewById(R.id.txtEmail);
TextView txtCnpjCpf = (TextView) convertView.findViewById(R.id.txtCnpjCpf);
RadioButton rbFisica = (RadioButton) convertView.findViewById(R.id.rbFisica);
RadioButton rbJuridica = (RadioButton) convertView.findViewById(R.id.rbJuridica);
CheckBox checkSituacao = (CheckBox)    convertView.findViewById(R.id.cxSituacao);
      
       txtNome.setText(cliente.getNome());
       txtEmail.setText(cliente.getEmail());
       txtCnpjCpf.setText(cliente.getCnpj_Cpf());
      
       if(cliente.getTipo_Pessoa() == "J")
       {
            rbJuridica.setChecked(true);
       }
       else
       {
            rbFisica.setChecked(true);
       }
      
       if(cliente.getSituacao() == "1" )
       {
            checkSituacao.setChecked(true);
       }
       else
       {
           checkSituacao.setChecked(false);
       }
      
       return convertView;
   }
}

Efetuamos a Sobrescrita do evento GetView(), é neste momento que montamos o lay-out desejado. Utilize a classe Clientes para obter o registro e logo em seguida utilizar o método inflate, responsável por "inflar" uma view e ter acesso aos seus atributos. Através da View capturada atribuímos cada campo para um tipo de variável e em seguida obtermos o resultado nestas mesmas variáveis. Os campos Nome, Email, Cnpj_Cpf apenas inserimos o valores, já para o Tipo de Pessoa fazemos um If identificando se é Jurídica ou Física e na Situação outro para verificar se o cliente está ativo ou não. Por final retornamos uma View para ser utilizada adiante.

3- Utilizando a Classe “theclubAdapter.java”

Esta é a parte mais fácil do artigo, utilize a mesma Atividade criada para programar o primeiro exemplo e crie uma função chamada ListarTheClubAdapter().

public void ListarTheClubAdapter()
{
      Clientes clientes = new Clientes();
List<Clientes> lista_clientes = clientes.ListarClientes();
ArrayAdapter<Clientes> ad = new theclubadapter(this,    R.layout.theclubadapter, lista_clientes);
      lstView.setAdapter(ad);
}

Nesta função instanciamos a classe clientes, jogamos em uma List<Clientes> e por final vamos fazer uso da classe “theclubadapter”, passando por parâmetro o contexto, o XML theclubadapter.xml e a lista de clientes. Por último atribuímos a um ListView. O resultado ficará idêntico ao da Figura 05.

Figura 05: Exemplo com TheClubAdapter.

Conclusão

O ListView se torna um componente indispensável quando trabalhamos com o Sistema Android se comparando ao DbGrid do Delphi, o GridView do Asp.Net. O ListView se destaca no aspecto de personalização do Lay-Out, sendo possível “brincar” da maneira e da forma que desejarmos.  Utiliza um “Adapter”, que trocando em miúdos seria um adaptador que usa o conteúdo vindo de uma fonte de dados, sendo que a mesma poderá vir de diversas origens. Espero que estes dois pequenos exemplos sirvam de base para o conhecimento básico aos senhores, Abraço e até o mês que vem!

Referências

Nenhum comentário:

Postar um comentário