sábado, 14 de abril de 2012

Adicionando conteúdo em um ListView dinamicamente

Atualmente tenho estudado um pouco de Android nas horas vagas, então vou colocar aqui no blog, alguns exemplos criados enquanto estudo.
Neste post, será mostrado um exemplo de como carregar um ListView de forma dinâmica.

Para a criação deste exemplo precisamos criar apenas um projeto Android simples.
Criei meu projeto no eclipse gerando o layout main.xml e para minha Activity principal dei o nome de AcademiaActivity (pois estou criando um projeto simples para academias).

O layout do aplicativo pode ser visualizado na imagem abaixo:


Abaixo segue o código do layout main.xml


<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:shrinkColumns="1,2">

<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/labelSerie"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/serie" />

<EditText
android:id="@+id/txtSerie"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:ems="5" >
<requestFocus />
</EditText>

<Button
android:id="@+id/btAdicionar"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:text="@string/adicionar" />

</TableRow>

<ListView
android:id="@+id/listaSeries"
android:smoothScrollbar="true"
android:background="#909BD3">
</ListView>

</TableLayout>


E abaixo segue o código da Atividade: AcademiaActivity.java


package br.com.academia;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class AcademiaActivity extends Activity {
private ArrayList series = new ArrayList();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// define o layout como o criado em main.xml
setContentView(R.layout.main);

// recuperando a listview declarada em main.xml para poder definir o adapter
ListView listaSeries = (ListView) findViewById(R.id.listaSeries);

// definindo a implementação ArrayAdapter como ListAdapter da ListView
// series é a lista de séries de treino definida como um ArrayList através de uma variável de instância
final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, series);
listaSeries.setAdapter(adapter);

// adicionando comportamento para o evento click do botão adicionar
Button btAdicionar = (Button) findViewById(R.id.btAdicionar);
btAdicionar.setOnClickListener(new OnClickListener() {
public void onClick(View view) {

// recuperando o texto digitado pelo usuario
EditText txtSerie = (EditText) findViewById(R.id.txtSerie);
String serie = txtSerie.getText().toString();

// caso o texto for preenchido, adiciona na lista e atualiza o adapter
// caso contrario exibe uma mensagem solicitando ao usuário que digite uma série
if (serie.length() > 0) {
txtSerie.setText("");
txtSerie.findFocus();
series.add(serie);
adapter.notifyDataSetChanged();
} else {
Toast.makeText(AcademiaActivity.this, "Digite o nome da série", Toast.LENGTH_SHORT).show();
}
}
});

}
}


Para criar uma Atividade que exibe apenas uma lista, a maioria dos exemplos indica criar a Atividade como uma classe que estende ListActivity ao invés de Activity pois ListActivity já possui uma ListView definida internamente, e no método onCreate não é necessário nem atribuir a contentView.
Como neste exemplo, temos alguns componentes para interagir com o usuário além da lista, acabei seguindo a abordagem acima definindo meu próprio ListView no layout principal.

A chave aqui para entender o funcionamento do ListView está em entender o seguinte trecho de código:


// definindo a implementação ArrayAdapter como ListAdapter da ListView
// series é a lista de séries de treino definida como um ArrayList através de uma variável de instância
final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, series);
listaSeries.setAdapter(adapter);


O conceito utilizado neste trecho de código é o conceito de Adapter. O Adapter permite fazer um bind entre os dados e a View, ou seja, o ArrayList e o ListView respectivamente.
Outra parte do código que é importante frisar aqui, é a atualização da ListView quando um item é adicionado no ArrayList. Esta atualização é realizada através do código abaixo:


adapter.notifyDataSetChanged();


Bom, este foi apenas um exemplo simples para mais uma vez documentar o que ando estudando. Talvez possa ajudar alguém.

4 comentários:

  1. Boa tarde Adolfo.

    Apesar de ser um exemplo simples, me ajudou muito. Parabéns pelo post, foi muito bem explicado e o código ficou bem simples.

    Parabéns e valeu!!!

    ResponderExcluir
  2. era exatamente o que eu qeria essa ultima linha me ajudou bastante. meu tcc agradece :)

    ResponderExcluir
  3. Pessoa, desculpe pela ignorância, mais não consegui fazer funcionar, quando clico na minha listview ele abre uma nova acitivity onde posso modificar e ou excluir, minha duvida é ai finalizar esta atividade eu fecho esta activity e volto para a Listview mais ela não e atualizada, como fazer e ou onde colocar : adapter.notifyDataSetChanged();

    Obrigado.

    ResponderExcluir
  4. Parabéns pelo post, simples e objetivo!

    ResponderExcluir