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:
- Arquivo style.xml - atributos dos textview que utilizamos em nosso fonte
- Arquivo list_bg.xml - definição de cores do nosso listview
- Arquivo text_bg.xml - definição das cores dos textview utilizados no arquivo estado_row.xml
- Utilização da classe ViewHolder no arquivo EstadoAdapter.java para aumentar a performance ao carregar os itens da lista.
- 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.
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 4 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html
Parte 5 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.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 4 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html
Parte 5 : http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.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!