quinta-feira, 3 de fevereiro de 2011

Utilizando spinner com objetos

Olá amigos

Neste post vamos mostrar como utilizar um spinner com objetos. No site oficial temos apenas exemplos com Strings e arquivos xml, porém é possivel utilizar spinner com qualquer tipo de objeto.


Partiremos da premissa que você já tem um projeto criado. No nosso caso criamos um projeto novo chamado SpinnerExample.
A primeira coisa que fizemos foi incluir um spinner no layout "main" e alterar o TextView padrão. Nosso main.xml ficou da seguinte forma:







Feito isso, criamos uma nova classe chamada Pessoa.java, com os atributos, id, nome, sobrenome e idade. Criamos também getters e setters para todos os atributos. No final criamos o método toString() para a classe Pessoa. Este é o passo mais importante, pois sem este método você terá uma exceção.
Nossa classe Pessoa ficou da seguinte forma:

package br.com.icoders;

public class Pessoa {
private int id;
private String nome;
private String sobrenome;
private int idade;

public int getId() {
 return id;
}
public void setId(int id) {
 this.id = id;
}
public String getNome() {
 return nome;
}
public void setNome(String nome) {
 this.nome = nome;
}
public String getSobrenome() {
 return sobrenome;
}
public void setSobrenome(String sobrenome) {
 this.sobrenome = sobrenome;
}
public int getIdade() {
 return idade;
}
public void setIdade(int idade) {
 this.idade = idade;
}
//Aqui esta a mágica, sem este método você terá uma exceção
public String toString() {
 return (this.getNome() + " " + this.getSobrenome());
}
}


Agora vamos para a nossa Activity, mostraremos como colocar os objetos no spinner e depois recupera-los.
Primeiro criamos um output e um spinner logo abaixo da declaração da classe:
public class SpinnerExample extends Activity {
private TextView output;
private Spinner spinner;


depois dentro do método onCreate mapeamos da seguinte forma:
       spinner = (Spinner) findViewById(R.id.spinner);
       output = (TextView) findViewById(R.id.output);


Criamos 2 instâncias de Pessoa e os adicionamos a um ArrayList do tipo Pessoa:
       Pessoa p1 = new Pessoa();
       p1.setId(0);
       p1.setNome("Vitor");
       p1.setSobrenome("Bertazoli");
       p1.setIdade(28);
       Pessoa p2 = new Pessoa();
       p2.setId(1);
       p2.setNome("Rafael");
       p2.setSobrenome("de Araújo");
       p2.setIdade(24);
      
       ArrayList pessoas = new ArrayList();
       pessoas.add(p1);
       pessoas.add(p2);


O próximo passo é criar um ArrayAdapter, onde vamos passar nosso ArrayList de pessoas como parâmetro e então fazer com que nosso spinner utilize o ArrayAdapter que acabamos de criar:

       ArrayAdapter pessoasAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, pessoas);
       spinner.setAdapter(pessoasAdapter);


Feito isso já conseguimos ver nossos objetos sendo mostrados no Spinner.

O próximo passo é recuperar o que está no spinner, para isso criamos um listener, verificamos o que foi selecionado e mostramos no nosso TextView output.
O código para isto ficou da seguinte forma:
       spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
  @Override
  public void onItemSelected(AdapterView parent, View arg1,
    int arg2, long arg3) {
   Pessoa p = (Pessoa) parent.getSelectedItem();
   output.setText(p.getNome() + " " + p.getIdade());
  }
  @Override
  public void onNothingSelected(AdapterView arg0) {
  }
 });


Pronto, agora você já consegue selecionar cada um dos itens no seu spinner e mostra-los no TextView.
No final não é nenhum bicho de 7 cabeças, tudo o que precisamos é do método toString no nosso objeto.

9 comentários:

  1. muito bom seus artigos, você poderia publicá-los no Portal Android... é um fórum muito bom sobre a tecnologia, seus artigos teriam uma grande visibilidade. Abraço!

    ResponderExcluir
  2. Parabéns pelo artigo!

    Eu segui seu tutorial, mas gostaria de exibir o nome no spinner e no text receber o id selecionado... como poderia fazer isso?

    Obrigada,

    ResponderExcluir
  3. Olá, para mostrar o id no campo texto (output) você pode alterar esta linha 'output.setText(p.getNome() + " " + p.getIdade());' para 'output.setText(p.getId()+"");' ou ainda pode alterar a classe Pessoa e ao invés de utilizar o tipo primitivo int, utilize Integer para o atributo ID (não esqueça de alterar os getter e setter) e utilizar o método .toString da seguinte maneira: 'output.setText(p.getId().toString());'

    Espero ter ajudado

    ResponderExcluir
  4. Mtooo bom o artigo !! Resolveum problemão meu...

    ResponderExcluir
  5. Teria como mostrar com exemplo pegar o id do item no spinner?

    ResponderExcluir
  6. Como fazer usando sqlite para preencher o spinner e pegar o id do selecionado no spinner?

    ResponderExcluir
  7. Parabéns. Post simples e objetivo.
    Meu ajudou muito.

    Sampaio

    ResponderExcluir
  8. Se no lugar do ArrayList fosse List funcionaria ? ou o ArrayAdapter
    não funciona para o List<>.

    ResponderExcluir
  9. List itensEstados = localizacaoService.obter_Estados();
    ArrayList estados_list = new ArrayList();
    for (Estado estado : itensEstados) {
    estados_list.add(estado);
    }

    Uma maneira de converter list em ArrayList....

    Agradeço pelo tópico, salvou mesmo 6 anos depois kkkk

    ResponderExcluir