Spinner - ID e Descricao.

2,438 views
Skip to first unread message

Evandro Choma

unread,
Aug 10, 2012, 2:27:07 PM8/10/12
to androidb...@googlegroups.com

Boa tarde


Pesquisei bastante, inclusive aqui no forum, mas não achei nada muito prático sobre o uso de Spinner com informações do banco de dados onde apresento uma informação ao usuário e salvo outra em um banco. Quando é Spinner com dados fixo como estado civil, sexo, etc é fácil, mas buscando do banco é monto ele apresento certo, mas para salvar na outra tabela que seria a minha dúvida.
Veja só o que preciso ao cadastrar o Cliente eu tenho o ramo de Atividade que vem de outra tabela, onde tenho o ID e a descrição, eu preciso mostrar a descrição na tela pro usuário escolher uma, mas ao salvar o cliente preciso salvar o ID do Ramo de Atividade e não a descrição da forma que sei ele salvaria a descrição, para bsucar o ID tendo a descrição pode acontecer de dar erro, caso eu tenha no cadastro 2 descrições iguais, não seria o ideal, mas poderia acontecer, mas o principal é que esta não seria uma lógica correta, buscar o ID pela descrição e salvar depois, ideal é ao carregar o Spinner já ter o Id guardado em algum local.

Veja como está o meu código de Edição de Clientes.

 



package br.com.afv.bean.editar;

// imports diversos

public class EditaClientes extends Activity {
    static final int RESULT_SALVAR = 1;
    static final int RESULT_EXCLUIR = 2;

    protected SQLiteDatabase db;

    private static final String NOME_BANCO = "bancoandroid";
    private static final String NOME_TABELA_RAMOATIVIDADE = "RAMOATIVIDADE";

    private EditText campoRazaoSocial,  ... ;
    private Spinner campoSpinnerRamoAtividade, ... ;
    private ImageButton btCancelar, btSalvar;

    private String idRepres;
    private int idCliente = 0;
    private int posicaoSpinner;
    NumberFormat numberFormat = new DecimalFormat("###,##0.00");

    String[] tipoPessoas = { "FISICA", "JURIDICA" };


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

        setContentView(R.layout.cliente_editar);

        Bundle extras = getIntent().getExtras();
        idRepres = extras.get("representante").toString();
        idCliente = extras.getInt("id");

        campoRazaoSocial = (EditText) findViewById(R.id.cli_e_razaosocial);
        campoRazaoSocial.setFilters(new InputFilter[] {new InputFilter.AllCaps(), new InputFilter.LengthFilter(60) });

...

 

        campoSpinnerTipoPessoa = (Spinner) findViewById(R.id.cli_e_tipopessoa);
        ArrayAdapter<String> arrayAdapterTipoPessoa = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, tipoPessoas);
        campoSpinnerTipoPessoa.setAdapter(arrayAdapterTipoPessoa);
        posicaoSpinner = arrayAdapterTipoPessoa.getPosition("JURIDICA");
        campoSpinnerTipoPessoa.setSelection(posicaoSpinner);

        campoSpinnerRamoAtividade = (Spinner) findViewById(R.id.cli_e_ramoatividade);
        carregaSpinnerRamoAtividade();

        if (idCliente != 0) {

// o cliente já está cadastrado pega os dados do cliente e coloca no formulário afim de alterar o que for necessário.

// desabilita os campos que não podem ser alterados

            campoEmail.requestFocus();
        } else {
// habilita os campos para a inclusão

            campoRazaoSocial.requestFocus();
        }

        btCancelar = (ImageButton) findViewById(R.id.btCancelar);
        btCancelar.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                setResult(RESULT_CANCELED);
                // Fecha a tela
                finish();
            }
        });

        btSalvar = (ImageButton) findViewById(R.id.btSalvar);
        btSalvar.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                salvar();
            }
        });
    }

   

    @Override
    protected void onPause() {
        super.onPause();
        setResult(RESULT_CANCELED);
        finish();
    }


    public void salvar() {
        Boolean valida = true;

// valida os campos Obrigatórios
        if (campoRazaoSocial.getText().toString().trim().equals("")) {
            Toast.makeText(this, "A Razão Social deve ser informada!", Toast.LENGTH_SHORT).show();
            valida = false;
        }


...


        switch (campoSpinnerTipoPessoa.getSelectedItemPosition()) {
        case 0: tipoPessoa = "F";
        case 1: tipoPessoa = "J";
        }

        if (valida) {

            Cliente cliente = new Cliente();

// pega os dados do formulário e coloca no objeto pessoa
            cliente.razaoSocial = campoRazaoSocial.getText().toString().trim();
            cliente.tipoPessoa = tipoPessoa;

 

...

 

// aqui está errado, mas como fazer? Desta forma está salvando a descrição do ramos de atividade e não o ID da tabela.

            cliente.ramoAtividade = campoSpinnerRamoAtividade.getSelectedItem().toString();

            salvarCliente(cliente);

            setResult(RESULT_OK, new Intent());
        }
    }


    // Salvar o cliente
    protected void salvarCliente(Cliente cliente) {
        ListaClientes.repositorio.salvar(cliente);
    }

   

// carrega o Spinner de Ramo de Atividades
    public void carregaSpinnerRamoAtividade() {
        List<String> ramoAtividades = new ArrayList<String>();

        try {
            db = openOrCreateDatabase(NOME_BANCO, MODE_WORLD_READABLE, null);
            final Cursor cursor = db.rawQuery("select ID, NOME from " + NOME_TABELA_RAMOATIVIDADE + " where ID_REPRES = '" + idRepres + "' order by NOME", null);

            if (cursor.moveToFirst()) {
                while (!cursor.isAfterLast()) {
                    ramoAtividades.add(cursor.getString(cursor.getColumnIndexOrThrow("NOME")));
                    cursor.moveToNext();
                }
            }

            cursor.close();

            ArrayAdapter<String> arrayAdapterRamoAtividades = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ramoAtividades);
            campoSpinnerRamoAtividade.setAdapter(arrayAdapterRamoAtividades);

        } catch (Exception erro) {
            Toast.makeText(this, "Erro ao carregar os Ramos de Atividades. " + erro, Toast.LENGTH_SHORT).show();
        }
    }
}

 

Alguem poderia me dar uma dica de como proceder no meu código para alcançar o objetivo esperado ou algum exemplo funcionando para que eu possa ver?

Neto Marin

unread,
Aug 10, 2012, 2:28:53 PM8/10/12
to androidb...@googlegroups.com
Faça um adapter para o Spinner.

[]s
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin


2012/8/10 Evandro Choma <evandr...@gmail.com>

Evandro Choma

unread,
Aug 10, 2012, 2:41:30 PM8/10/12
to androidb...@googlegroups.com
Como assim adapter?
teria um exemplo?

Obrigado
Evandro Choma

Neto Marin

unread,
Aug 10, 2012, 2:50:21 PM8/10/12
to androidb...@googlegroups.com
http://developer.android.com/reference/android/widget/Spinner.html

Lá vc pode ver q tem um método setAdapter q recebe um SpinnerAdapter. Vc pode fazer um adapter que receba o objeto que vc quer apresentar, cuidando então da visualização, e ai vc pode ter métodos pra te retornarem o objeto selecionado.

ou vc pode usar o OnItemSelectedListener http://developer.android.com/reference/android/widget/AdapterView.html#setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener) e ai saber quando há o click. Lembrando que você deve guardar um ArrayList (ou outra estrutura), assim pode procurar o objeto selecionado lá e obte-lo. Enfim, existem várias opções...

Evandro Choma

unread,
Aug 15, 2012, 3:39:43 PM8/15/12
to androidb...@googlegroups.com
Fiz de forma que deu certo a apresentação, conforme o link http://www.androidbrasilprojetos.org/android/adapter-personalizado-custom-adapter/ contudo depois de pronto como fazer para pegar o código?

Quando eu utilizava com dados fixos no Spinner e queria pegar a posição que foi escolhida eu usava assim : campoSpinnerRamoAtividade.getSelectedItem() e quando eu queria pegar o testo apresentado no Spinner fazia assim: campoSpinnerRamoAtividade.getSelectedItem().toString()

Mas e agora com o Adapter, onde eu fiz uma lista de objetos e passei par ao Spinner de forma que ele mostrou um deles na tela, mas quero recuparar o Objeto para pegar o Código que é um dos atributos do objetos, como proceder?

Obregado desde já.


--
[]´s
Evandro Choma

Pedro Subutzki <Pepeu>

unread,
Aug 15, 2012, 3:50:39 PM8/15/12
to androidb...@googlegroups.com
Eu costumo guardar a lista que foi carregada e pego pela posição no evento de ItemClick.
Já tentou?!

--
Abraços,
Pedro Subutzki
__________________________________________
HADI - Makes SQLite in Android easy and simple
https://github.com/PepeuCps/Hadi

Evandro Choma

unread,
Aug 15, 2012, 4:42:52 PM8/15/12
to androidb...@googlegroups.com
Coloqui assim no Log pra testar e trouxe as informações que eu precisava no ID.
Log.i("AFV","Lista: " + ramoAtividades.get(campoSpinnerRamoAtividade.getSelectedItemPosition()).getId() + " - " + ramoAtividades.get(campoSpinnerRamoAtividade.getSelectedItemPosition()).getNome());

Obrigado a todos pela Ajuda.

Abraços
Evandro Choma

Evandro Choma

unread,
Oct 9, 2012, 1:37:29 PM10/9/12
to androidb...@googlegroups.com
sim, vc precisa fazer o que especificamente? me diga certinho o que preciso que vejo como seria a melhor opção.
vc queria pegar dados do banco de dados ou de onde?



Em 9 de outubro de 2012 12:58, JUNIOR_FERREIRA <web2...@gmail.com> escreveu:
Evandro Boa tarde !

Estou querendo fazer algo parecido, mas não sei por onde iniciar !

Pode da uma ajuda ?

já que o amigo passou por isso !

--





--
[]´s
Evandro Choma
Engenheiro da Computação

--

PS:  ME PROTEJA COMO EU PROTEGI VOCE!
Se você pretende redirecionar este e-mail, por favor, apague todos os  endereços que aparecem nele. Contribua para a preservação da intimidade e sigilo individual. Outra dica de segurança é endereçá-lo no Cco ou Bcc. Desta forma, você estará protegendo a mim, seus amigos e a você mesmo. Eu, juntamente com a campanha contra a propagação de vírus, agradeço sinceramente.

Analista de Sistemas Web/Mobile

unread,
Oct 9, 2012, 1:50:32 PM10/9/12
to androidb...@googlegroups.com
Boa Tarde Evandro..

Vou pegar as informações do banco de dados, local do sqllite, mas vou ter uma parte webservice que não vai ser usada no momento.

LOCAL, tenho as seguinte tabelas no meu android

Cliente 1 ----------------------------N Produtos N---------------------------Pedidos


Irei ter somente uma tela:

Cadastro de pedidos, nela eu tenho 2 combobox ou spinner, e um botão para salvar.

<<<<<<<<<<<Lista de Clientes>>>>>>>>>>>>> FK_CLIENTE
<<<<<<<<<<<Lista de Produtos>>>>>>>>>>>>>FK_PRODUTOS

<Botão Salvar>


Relacionamentos das tabelas ta assim:


clientes
id nome 

produtos
id descricao

pedidos
id fk_produtos  fk_cliente




   José Ribamar Ferreira Junior
Analista de Sistemas Web - Mobile 
Secretaria da Sáude - Governo do Estado do Ceará

      Cel:  (85) 92412818
              (85) 85656342   

            web2...@gmail.com
            web2...@hotmail.com    







--
 
 

Evandro Choma

unread,
Oct 9, 2012, 2:51:29 PM10/9/12
to androidb...@googlegroups.com
Júnior uma coisa que tenho ficaria mais ou menos assim, veja se te ajuda, se não ajudar detalhe pra mim o que ficou de dúvidas.

No onCreate da classe ontem possui o Spinner vc coloca assim:
        campoSpinnerIDCliente = (Spinner) findViewById(R.id.pdh_e_idcliente);
        carregaSpinnerCliente();
        campoSpinnerIDCliente.setPrompt("Selecione o Cliente");

Dai vc precisa ter o carregaSpinnerCliente que seria assim:
    public void carregaSpinnerCliente() {
    clientes = new ArrayList<Cliente>();


        try {
            db = openOrCreateDatabase(NOME_BANCO, MODE_WORLD_READABLE, null);
            final Cursor cursor = db.rawQuery("select ID, RAZAO_SOCIAL, CAMPOS_DA_TABELA_CLIENTE  from TBCLIENTES where CAMPOS DE FILTRO = '" + filtro + "' order by RAZAO_SOCIAL", null);
           
            if (cursor.moveToFirst()) {
                while (!cursor.isAfterLast()) {
                    clientes.add(new Cliente(
                            cursor.getInt(cursor.getColumnIndexOrThrow("ID")),
                            cursor.getString(cursor.getColumnIndexOrThrow("RAZAO_SOCIAL")),
ATRIBUTOS DO OBJETO
                            ));

                    cursor.moveToNext();
                }
            }
           
            cursor.close();
           
            ClienteSpinnerAdapter clienteSpinnerAdapter = new ClienteSpinnerAdapter(getApplicationContext(), clientes);
            campoSpinnerIDCliente.setAdapter(clienteSpinnerAdapter);

            db.close();
        } catch (Exception erro) {
            Toast.makeText(this, "Erro ao carregar os Clientes. " + erro, Toast.LENGTH_SHORT).show();
        }
    }

   
Dai estaria OK. o ClienteSpinnerAdapter seria apenas a listagem como irá apresentar se tiver dificuldade eu te passo mas seria apenas a listagem.

Espero ter ajudado.

Ivan @ Floripa

unread,
Oct 21, 2012, 11:29:32 AM10/21/12
to androidb...@googlegroups.com
Olá,

Não consegui montar o Spinner Específico do Cliente, podes me ajudar ou me enviar o exemplo?

Preciso salvar e carregar os dados pelo ID mais na exibição uma Descricao.

Obrigado.

Evandro Choma

unread,
Oct 22, 2012, 6:25:59 AM10/22/12
to androidb...@googlegroups.com
Bom Dia Ivan

Você precisa criar um array e lá colocar os dados da tabela 1, eu coloco lá o meu objeto inteiro, para caso eu preciso de qualquer informação daquele objeto, tipo ao selecionar o cliente na tabela de pedido eu posso já pegar uma informação e popular algum campo do cadastro ou calcular alguns % específico daquele cliente.
Dai ao acessar o cadastro vc cria um spinner onde vc mostra um determinado campo do array, mas ao salvar no banco você pega o outro item do array no caso o ID.
Caso tenha dificuldades em algum dos passos pode entrar em contato.

Abraços
Evandro Choma


--
 
 

Ivan Silva

unread,
Oct 22, 2012, 7:41:51 AM10/22/12
to androidb...@googlegroups.com
Obrigado Evandro,

Tentei criar um Spinner Especifico para qualquer objeto que tenho "Cliente", "Produto", "Loja", etc... cujo em todos os Spinner eu vou mostrar na tela uma Descricao "nome do cliente", "descricao produto", etc... porem na base quero salvar o ID do objeto salvo no banco. Queria saber se é possivel fazer um spinner generico para qualquer Objeto que seja ID e Descricao ou se eu tenho que criar um SpinnerCliente, SpinnerProduto, SpinnerLoja, etc...

A minha maior dificuldade agora é criar esse Spinner Generico, tu podes me enviar o seu SpinnerClienteAdpater para eu ter uma ideia de como fazer.

Obrigado,

--
 
 



--
Ivan Roberto da Silva
Gerente de Projetos
MBA Gestão de Projetos de Softwares
SCJP - Sun Certified Java Programmer

Bhaiyh Sistemas - Desenvolvimento sob encomenda
(48) 8437-6070 / (48) 3223-0334

Evandro Choma

unread,
Oct 22, 2012, 8:04:27 AM10/22/12
to androidb...@googlegroups.com
Ivan
Poderia fazer genérico sim, mas no meu caso eu faço eles direcionado, pois em vários deles eu poderia utilizar algum atributo do objeto depois de selecionado, com isto o spinner estará sempre completo.

Segue abaixo exemplo de como eu faço os meus spinner.

CadastroOndeUtilizareiSpinner

    List<Cliente> clientes;

    protected void onCreate(Bundle savedInstanceState) {

        campoSpinnerIDCliente = (Spinner) findViewById(R.id.pdh_e_idcliente);
        carregaSpinnerCliente();
        campoSpinnerIDCliente.setPrompt("Selecione o Cliente");

        if (Se for alteração do cadastro) {

            for (int i = 0; i < campoSpinnerIDCliente.getCount(); i++) {
                if (idClientedoRegistro == clientes.get(i).getId()) {
                    campoSpinnerIDCliente.setSelection(i);
                }
            }
       }
  }



    // carrega o Spinner de Cliente
    public void carregaSpinnerCliente() {
    clientes = new ArrayList<Cliente>();


        try {
            db = openOrCreateDatabase(NOME_BANCO, MODE_WORLD_READABLE, null);
            final Cursor cursor = db.rawQuery("select ID, RAZAO_SOCIAL, NOME_FANTASIA, ... , XXX" +
                                              " from CLIENTE " +
                                              " where SITUACAO = 'A' order by RAZAO_SOCIAL", null);
           
            if (cursor.moveToFirst()) {
                while (!cursor.isAfterLast()) {

                    clientes.add(new Cliente(
                            cursor.getInt(cursor.getColumnIndexOrThrow("ID")),
                            cursor.getString(cursor.getColumnIndexOrThrow("RAZAO_SOCIAL")),
                            cursor.getString(cursor.getColumnIndexOrThrow("NOME_FANTASIA")),
                            cursor.getString(cursor.getColumnIndexOrThrow("TIPO_LOGRAD")),
                            cursor.getString(cursor.getColumnIndexOrThrow("NOME_LOGRAD")),
                            cursor.getInt(cursor.getColumnIndexOrThrow("NUM_LOGRAD")),
                            cursor.getString(cursor.getColumnIndexOrThrow("COMPL_LOGRAD")),

                            ...


                    cursor.moveToNext();
                }
            }
           
            cursor.close();
           
            ClienteSpinnerAdapter clienteSpinnerAdapter = new ClienteSpinnerAdapter(getApplicationContext(), clientes);
            campoSpinnerIDCliente.setAdapter(clienteSpinnerAdapter);

            db.close();
        } catch (Exception erro) {
            Toast.makeText(this, "Erro ao carregar os Clientes. " + erro, Toast.LENGTH_SHORT).show();
        }
    }



ClienteSpinnerAdapter.java
package br.com.afv.banco.repositorio;

import java.util.List;

import br.com.afv.R;
import br.com.afv.bean.Cliente;

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 ClienteSpinnerAdapter extends BaseAdapter {
    private List<Cliente> clientes;
    private LayoutInflater mInflater;
    private ViewHolder holder;
   
    static class ViewHolder {
        private TextView tvNome;
    }

    public ClienteSpinnerAdapter(Context context, List<Cliente> clientes) {
        mInflater = LayoutInflater.from(context);
        this.clientes = clientes;
    }

    public int getCount() {
        return clientes.size();
    }

    public Object getItem(int position) {
        return clientes.get(position);
    }

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

    public View getView(int posicao, View convertView, ViewGroup arg2) {

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.cliente_spinner, null);

            holder = new ViewHolder();

            holder.tvNome = (TextView) convertView.findViewById(R.id.nome);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
       
        Cliente cli = clientes.get(posicao);
        holder.tvNome.setText(cli.getRazaoSocial());

        return convertView;
    }
}


cliente_spinner.xml
// aqui vc poderá colocar vários atributos dentro do seu spinner, caso queria colocar Id e Descrição é aqui que vc irá fazer, mas dai no arquivo anterior precisa lançar o conteúdo pra ele.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
   
    <TextView
        android:id="@+id/nome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:textColor="#000000"
        android:gravity="center_vertical" >
    </TextView>

</LinearLayout>



Espero ter ajudado, qualquer coisa entre novamente em contato

Abraços

Ivan Silva

unread,
Oct 22, 2012, 8:08:03 AM10/22/12
to androidb...@googlegroups.com
Muito Obrigado Evandro,

Com isso acho que vou conseguir.

Se eu nao conseguir posto minhas dificuldades.

Muito obrigado.

--
 
 

Evandro Choma

unread,
Oct 22, 2012, 8:15:24 AM10/22/12
to androidb...@googlegroups.com
Ok fico no aguardo de seu retorno, positivo de preferência.



--
 
 



--
[]´s
Evandro Choma
Engenheiro da Computação

--

Ivan Silva

unread,
Oct 22, 2012, 7:47:13 PM10/22/12
to androidb...@googlegroups.com
Evandro,

Consegui fazer o Spinner especifico onde apresento na tela a Descricao e ao salvar na base incluio o ID.. Tambem consegue carregar do banco o ID e setar no spinner e exibir a descricao... Tudo 100% muito obrigado.

Agora tenho uma dúvida... quando eu utilizava o Spinner padrão a listagem abria no proprio componente e agora esta abrindo uma popup com essa lista. Existe uma opção para que eu continue abrindo a listagem na mesma tela sem abrir uma nova popup?

Obrigado.
SpinnerTemporada.png

Evandro Choma

unread,
Oct 23, 2012, 6:12:57 AM10/23/12
to androidb...@googlegroups.com
Eu faço todos eles abrindo em nova janela, mesmo os spinner que pergunta apenas sim ou não, como fazer na mesma deve ter como sim, agora como faz eu não sei. o que faço é colocar título na declaração do Spinner, assim fica mais bonitinho. hehe


        campoSpinnerIDCliente = (Spinner) findViewById(R.id.pdh_e_idcliente);
        carregaSpinnerCliente();
        campoSpinnerIDCliente.setPrompt("Selecione o Cliente");

Esta ultima linha o comando setPrompt Coloca o Título do spinner, dai já acaba deixando com uma borda melhor tb.

Abraços
Evandro Choma

Ivan Silva

unread,
Oct 23, 2012, 6:36:00 AM10/23/12
to androidb...@googlegroups.com
Evandro,

Vou adotar seu padrão e abrir sempre numa popup e com o titulo.

Obrigado pela atenção e pela ajuda.

Att,

Alexandre Marins

unread,
Oct 13, 2013, 3:59:57 PM10/13/13
to androidb...@googlegroups.com
Boa Tarde, eu ja tenho a Classe onde eu carrego o spinner e salvo o ID no Banco de dados, agora eu estou fazendo a rotina para carregar a Tela e ai poder alterar os dados, com isto queria alimentar o Spinner com o Nome do Cliente, porém no Banco onde esta salvo so tenho o id, o SQL eu faço mais os a parte do código para Setar o spinner com o ID e Nome e alimentar a tela não estou conseguindo.

Alguem pode me ajudar. 


Em sexta-feira, 10 de agosto de 2012 15h27min07s UTC-3, Evandro Choma escreveu:

pedrofsn

unread,
Oct 14, 2013, 7:33:55 AM10/14/13
to androidb...@googlegroups.com, neto...@gmail.com
Aproveitando o tópico...

Como faço pra deixar um valor default em um spinner?
Estou usando Action Bar Sherlock (2.3.3+), não sei se influencia em algo.

Já tentei usar o "prompt" via XML e Java.
Reply all
Reply to author
Forward
0 new messages