sexta-feira, 16 de março de 2012

Android - ListView Parte 7

Olá,

Vou apresentar mais uma opção de lista de itens, nesse caso, atendendo a pedidos vou criar uma lista de itens e de acordo com um determinado parâmetro a cor do texto será diferente da cor padrão utilizada em todos os itens da lista.

A lista será criada com base em alguns Estados brasileiros e para isso será criada uma classe de POJO para guardar as informações de Estado, Capital e um Status.

O campo de Status servirá para identificar se o estado será pintado com uma cor diferente da cor padrão, caso o campo Status seja igual a "1" a cor dos dados será vermelha caso seja igual a "2" a cor dos dados será branca.

Será necessário criar um Adapter customizado para efetuar esse processo.

Abaixo seguem os fontes utilizados nesse projeto:

Arquivo EstadoPojo.java
package br.com.empresa;

public class EstadoPojo {
    private long status;
    private String estado;
    private String capital;
    
    public void setStatus(long status) {
        this.status = status;
    }
    public long getStatus() {
        return status;
    }
    public void setEstado(String nome) {
        this.estado = nome;
    }
    public String getEstado() {
        return estado;
    }
    public void setCapital(String endereco) {
        this.capital = endereco;
    }
    public String getCapital() {
        return capital;
    }
}

Arquivo main.java
package br.com.empresa;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

public class main extends ListActivity {

    private SpecialAdapter mAdapter;

    public void onListItemClick(ListView parent, View v, int position, long id) {
         toast("Você clicou no item : " + String.valueOf(position));
    }    
        
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //definindo variável do tipo EstadoPOJO
        EstadoPojo estado;
        mAdapter = new SpecialAdapter(this);

        //criando a variável estado e atribuindo os valores desejados
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Minas Gerais");
        estado.setCapital("Belo Horizonte");
        //adicionando o estado ao Adapter
        mAdapter.addItem(estado);

        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Rio Grande do Sul");
        estado.setCapital("Porto Alegre");
        mAdapter.addItem(estado);

        estado = new EstadoPojo();
        estado.setStatus(1);
        estado.setEstado("Rio Grande do Norte");
        estado.setCapital("Natal");
        mAdapter.addItem(estado);

        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Amazonas");
        estado.setCapital("Manaus");
        mAdapter.addItem(estado);

        estado = new EstadoPojo();
        estado.setStatus(1);
        estado.setEstado("Pará");
        estado.setCapital("Belém");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Paraná");
        estado.setCapital("Curitiba");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("São Paulo");
        estado.setCapital("São Paulo");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Goiás");
        estado.setCapital("Goiânia");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Santa Catarina");
        estado.setCapital("Florianópolis");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Bahia");
        estado.setCapital("Salvador");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Ceará");
        estado.setCapital("Fortaleza");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(1);
        estado.setEstado("Piauí");
        estado.setCapital("Teresina");
        mAdapter.addItem(estado);
        
        estado = new EstadoPojo();
        estado.setStatus(2);
        estado.setEstado("Rondônia");
        estado.setCapital("Porto Velho");
        mAdapter.addItem(estado);

        
        setListAdapter(mAdapter);
    }
    
    public void toast (String msg)
    {
        Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
    }     
}

Arquivo SpecialAdapter.java
package br.com.empresa;

import java.util.ArrayList;
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.TextView;

public class SpecialAdapter extends BaseAdapter {
     
    private List<EstadoPojo> mData = new ArrayList<EstadoPojo>();
    
    //Classe utilizada para instanciar os objetos do XML
    private LayoutInflater mInflater;
    Context context;

    public SpecialAdapter(Context context) {
        this.context = context;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(final EstadoPojo item) {
        mData.add(item);
        //Atualizar a lista caso seja adicionado algum item
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public EstadoPojo getItem(int position) {
        return  mData.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //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 = mInflater.inflate(R.layout.main, null);

            //Cria o Viewholder e guarda a instância dos objetos
            holder = new ViewHolder();
            holder.textEstado = (TextView)convertView.findViewById(R.id.txtEstado);
            holder.textCapital = (TextView)convertView.findViewById(R.id.txtCapital);
            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.textEstado.setText("Estado :" + (CharSequence) mData.get(position).getEstado());
        holder.textCapital.setText("Capital :" + (CharSequence) mData.get(position).getCapital());
        
        //Modifica a cor do texto de acordo com a propriedade Status
        if (mData.get(position).getStatus() == 1)
        {
            holder.textEstado.setTextColor(context.getResources().getColor(R.color.red));
            holder.textCapital.setTextColor(context.getResources().getColor(R.color.red));
        }else{
            holder.textEstado.setTextColor(context.getResources().getColor(R.color.white));
            holder.textCapital.setTextColor(context.getResources().getColor(R.color.white));
        }
        
        return convertView;
    }

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

Arquivo main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView 
        android:text="TextView" 
        android:id="@+id/txtEstado" 
        android:gravity="center_vertical"
        android:layout_width="wrap_content" 
        android:layout_height="30sp">
    </TextView>
    <TextView 
        android:text="TextView" 
        android:id="@+id/txtCapital" 
        android:gravity="center_vertical"
        android:layout_width="wrap_content" 
        android:layout_height="30sp">
    </TextView>
</LinearLayout>

Como resultado temos a seguinte imagem:
ListView



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




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!

3 comentários:

Widhey Henrique disse...

Sinto em lhe dizer que a capital de Goiás é Goiânia, e não Goiania. :)
(Eu até deixaria de lado se não visse que prestou atenção em colocar um acento em Goiás e também em Florianópolis.)

Marcio de Souza disse...

Obrigado pela ajuda.

Já está corrigido!

Unknown disse...

Como faço para iniciar o listview no ultimo item?