Tutorial Android #4 – Adicionando uma Lista

Padrão

Olá pessoal! No tutorial de hoje da série sobre Android, vamos começar a adicionar funcionalidade ao nosso aplicativo. Com o post de hoje, conseguiremos adicionar os restaurantes, que serão listados no aplicativo.

Começando a colocar a mão na massa, o primeiro passo é trocarmos a instância única da classe Restaurante por uma lista de objetos. Porém, a simples mudança acarretará alguns erros no código. Assim, também precisaremos montar o objeto no método onClick e o adicionarmos na lista. Com essas alterações, o nosso arquivo ListaRestaurantes.java vai ficar assim:

package net.rafaeltoledo.restaurante;</p>
<p>import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import net.rafaeltoledo.restaurante.model.Restaurante;<br />
import android.app.Activity;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;<br />
import android.widget.EditText;<br />
import android.widget.RadioGroup;</p>
<p>public class ListaRestaurantes extends Activity {</p>
<p>	List&lt;Restaurante&gt; listaRestaurantes = new ArrayList&lt;Restaurante&gt;();</p>
<p>	@Override<br />
	public void onCreate(Bundle savedInstanceState) {<br />
		super.onCreate(savedInstanceState);<br />
		setContentView(R.layout.main);</p>
<p>		Button salvar = (Button) findViewById(R.id.salvar);<br />
		salvar.setOnClickListener(onSave);<br />
	}</p>
<p>	private OnClickListener onSave = new OnClickListener() {</p>
<p>		public void onClick(View arg0) {<br />
			Restaurante r = new Restaurante();<br />
			EditText nome = (EditText) findViewById(R.id.nome);<br />
			EditText endereco = (EditText) findViewById(R.id.end);</p>
<p>			r.setNome(nome.getText().toString());<br />
			r.setEndereco(endereco.getText().toString());</p>
<p>			RadioGroup tipos = (RadioGroup) findViewById(R.id.tipos);</p>
<p>			switch (tipos.getCheckedRadioButtonId()) {<br />
			case R.id.rodizio:<br />
				r.setTipo(&quot;rodizio&quot;);<br />
				break;<br />
			case R.id.fast_food:<br />
				r.setTipo(&quot;fast_food&quot;);<br />
				break;<br />
			case R.id.a_domicilio:<br />
				r.setTipo(&quot;a_domicilio&quot;);<br />
				break;<br />
			}</p>
<p>			listaRestaurantes.add(r);<br />
		}<br />
	};<br />
}

Basicamente, o que fizemos foi retirar o objeto r que estava no escopo da classe e o colocamos no método onClick. Além disso, criamos a lista chamada listaRestaurantes como um atributo da classe, e ao final do método onClick, adicionamos o objeto à lista.

O próximo passo é implementarmos o método toString() da classe Restaurante, já que ele será chamado quando os restaurantes forem listados. Para o nosso objetivo, nos interessa apenas o nome do restaurante, de forma que o método toString() pode retornar o método getNome(). Dessa forma, nossa classe Restaurante fica assim:

package net.rafaeltoledo.restaurante.model;</p>
<p>public class Restaurante {</p>
<p>	private String nome = &quot;&quot;;<br />
	private String endereco = &quot;&quot;;<br />
	private String tipo = &quot;&quot;;</p>
<p>	public String getNome() {<br />
		return nome;<br />
	}</p>
<p>	public void setNome(String nome) {<br />
		this.nome = nome;<br />
	}</p>
<p>	public String getEndereco() {<br />
		return endereco;<br />
	}</p>
<p>	public void setEndereco(String endereco) {<br />
		this.endereco = endereco;<br />
	}</p>
<p>	public String getTipo() {<br />
		return tipo;<br />
	}</p>
<p>	public void setTipo(String tipo) {<br />
		this.tipo = tipo;<br />
	}</p>
<p>	@Override<br />
	public String toString() {<br />
		return getNome();<br />
	}<br />
}

Agora temos a parte mais desafiadora, que é exatamente mostrar a lista de restaurantes na tela de acordo que formos adicionando-os. Uma forma de fazer isso é utilizando o RelativeLayout, de forma que o formulário permaneça na parte de baixo da tela e os restaurantes adicionados sejam listados na parte superior. Vamos alterar o arquivo main.xml para que fique com esse aspecto:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />
&lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;<br />
    android:layout_width=&quot;fill_parent&quot;<br />
    android:layout_height=&quot;fill_parent&quot;&gt;<br />
	&lt;TableLayout android:id=&quot;@+id/detalhes&quot;<br />
    	android:layout_width=&quot;fill_parent&quot;<br />
    	android:layout_height=&quot;wrap_content&quot;<br />
    	android:layout_alignParentBottom=&quot;true&quot;<br />
    	android:stretchColumns=&quot;1&quot;&gt;<br />
    	&lt;TableRow&gt;<br />
        	&lt;TextView android:text=&quot;Nome:&quot;/&gt;<br />
        	&lt;EditText android:id=&quot;@+id/nome&quot;/&gt;<br />
    	&lt;/TableRow&gt;<br />
    	&lt;TableRow&gt;<br />
        	&lt;TextView android:text=&quot;Endereço:&quot;/&gt;<br />
        	&lt;EditText android:id=&quot;@+id/end&quot;/&gt;<br />
    	&lt;/TableRow&gt;<br />
    	&lt;TableRow&gt;<br />
        	&lt;TextView android:text=&quot;Tipo:&quot;/&gt;<br />
        	&lt;RadioGroup android:id=&quot;@+id/tipos&quot;&gt;<br />
            	&lt;RadioButton android:id=&quot;@+id/rodizio&quot;<br />
                	android:text=&quot;Rodízio&quot;/&gt;<br />
            	&lt;RadioButton android:id=&quot;@+id/fast_food&quot;<br />
                	android:text=&quot;Fast Food&quot;/&gt;<br />
            	&lt;RadioButton android:id=&quot;@+id/a_domicilio&quot;<br />
                	android:text=&quot;A Domicílio&quot;/&gt;<br />
        	&lt;/RadioGroup&gt;<br />
    	&lt;/TableRow&gt;<br />
    	&lt;Button android:id=&quot;@+id/salvar&quot;<br />
        	android:layout_width=&quot;fill_parent&quot;<br />
        	android:layout_height=&quot;wrap_content&quot;<br />
        	android:text=&quot;Salvar&quot;/&gt;<br />
	&lt;/TableLayout&gt;<br />
	&lt;ListView android:id=&quot;@+id/restaurantes&quot;<br />
	    android:layout_width=&quot;fill_parent&quot;<br />
	    android:layout_height=&quot;wrap_content&quot;<br />
	    android:layout_alignParentTop=&quot;true&quot;<br />
	    android:layout_above=&quot;@id/detalhes&quot;/&gt;<br />
&lt;/RelativeLayout&gt;

Basicamente o que fizemos foi englobar o TableLayout que tínhamos dentro do RelativeLayout, ajustando suas dimensões. Além disso, tivemos também um item chamado ListView, definido pelo nome restaurantes, que será quem armazenará a nossa lista de restaurantes. Um importante parâmetro é o android:layout_above que indicará que nosso TableLayout, agora nomeado como detalhes, será exibido logo em seguida ao nosso RelativeLayout.

Se executarmos nosso aplicativo agora, ele deverá ter essa aparência:

Agora, precisamos fazer alguns ajustes na nossa Activity para que os elementos sejam adicionados e listados. Abra o arquivo ListaRestaurantes.java novamente e edite-o:

package net.rafaeltoledo.restaurante;</p>
<p>import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import net.rafaeltoledo.restaurante.model.Restaurante;<br />
import android.app.Activity;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.ArrayAdapter;<br />
import android.widget.Button;<br />
import android.widget.EditText;<br />
import android.widget.ListView;<br />
import android.widget.RadioGroup;</p>
<p>public class ListaRestaurantes extends Activity {</p>
<p>	List&lt;Restaurante&gt; listaRestaurantes = new ArrayList&lt;Restaurante&gt;();<br />
	ArrayAdapter&lt;Restaurante&gt; adaptador = null;</p>
<p>	@Override<br />
	public void onCreate(Bundle savedInstanceState) {<br />
		super.onCreate(savedInstanceState);<br />
		setContentView(R.layout.main);</p>
<p>		Button salvar = (Button) findViewById(R.id.salvar);<br />
		salvar.setOnClickListener(onSave);</p>
<p>		ListView lista = (ListView) findViewById(R.id.restaurantes);<br />
		adaptador = new ArrayAdapter&lt;Restaurante&gt;(this,<br />
				android.R.layout.simple_list_item_1, listaRestaurantes);<br />
		lista.setAdapter(adaptador);<br />
	}</p>
<p>	private OnClickListener onSave = new OnClickListener() {</p>
<p>		public void onClick(View arg0) {<br />
			Restaurante r = new Restaurante();<br />
			EditText nome = (EditText) findViewById(R.id.nome);<br />
			EditText endereco = (EditText) findViewById(R.id.end);</p>
<p>			r.setNome(nome.getText().toString());<br />
			r.setEndereco(endereco.getText().toString());</p>
<p>			RadioGroup tipos = (RadioGroup) findViewById(R.id.tipos);</p>
<p>			switch (tipos.getCheckedRadioButtonId()) {<br />
			case R.id.rodizio:<br />
				r.setTipo(&quot;rodizio&quot;);<br />
				break;<br />
			case R.id.fast_food:<br />
				r.setTipo(&quot;fast_food&quot;);<br />
				break;<br />
			case R.id.a_domicilio:<br />
				r.setTipo(&quot;a_domicilio&quot;);<br />
				break;<br />
			}</p>
<p>			adaptador.add(r);<br />
		}<br />
	};<br />
}

O que fizemos foi adicionar o elemento adaptador, do tipo ArrayAdapter. É ele quem fará a montagem dos restaurantes adicionados na tela. Definimos a forma como ele funcionará em seu construtor, na linha 31, indicando o segundo parâmetro android.R.layout.simple_list_item_1, dizendo que será uma lista da classe Restaurante, e passando o parâmetro listaRestaurantes. Vinculamos o adaptador, então, ao item ListView que foi declarado no main.xml, e que o obtemos através do método findViewById(). Assim, chamamos seu método setAdapter e passamos o nosso adaptador.

Ao final, no método onClick, ao invés de adicionarmos o restaurante à lista, adicionamos ao adaptador. O resultado será a lista de restaurantes sendo criada em nosso aplicativo:

Bom, por hoje é isso! Pra quem teve problemas, pode baixar o projeto aqui.

Até a próxima!