[Resolvido] Como popular uma spinner?

Bom dia irmãos,

Estou tentando popular spinners com informações do banco e estou com dificuldades.

Estas spinners são dinâmicas (na sua quantidade e nas suas informações).

Criar as spinners dinâmicas deu certo.

Recuperei os valores e enviei para um Log.i para testar e também deu certo.

O problema é na hora de popular as spinners.

Estou tentando fazer assim

Segue o trecho do código.


case 5:  
                
            	List<OpcoesInfo> opcInf = coletaDao.listaDadosSpinners(String.valueOf(recuperaIdInfo));
            	            	
            	int opcoesInfo = coletaDao.listaDadosSpinners(String.valueOf(recuperaIdInfo)).size();
            	            	
                nomeInfoTipo5.setText(infos.get(i).getNomeInfo());
                linearLayout.addView(nomeInfoTipo5);  
                
                  
// FOR PARA TESTAR AS INFORMAÇÕES  
           
                for(int d = 0; d < opcoesInfo; d++){
                	                	
                	Log.i(CATEGORIA, "DADOS: " + opcInf.get(d).getNomeOpcao());
                	
                }
                
             ArrayAdapter adaptador = new ArrayAdapter(this, android.R.layout.simple_spinner_item, opcInf);
                
             adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                                              
               escolha[i].setAdapter(adaptador);
               
               linearLayout.addView(escolha[i]);  
                  
            break;  

Fazendo desta forma ele popula o total de informações corretamente, mas aparece deste jeito

[code] [OpcoesInfo [codOpcao=1, nomeOpcao=Sim, descricaoOpcao=null, codInfo=null], OpcoesInfo [codOpcao=2, nomeOpcao=Não, descricaoOpcao=null, codInfo=null]]

[/code]

Eu preciso que as spinners sejam populadas com os nomes e que os IDs sejam setados na hora da escolha para envia-los ao banco na hora de salvar.

Segue a classe completa


package br.com.mylims.controller;  
  
  
import java.util.List;  
  
import br.com.mylims.bean.Info;  
import br.com.mylims.bean.OpcoesInfo;
import br.com.mylims.model.ColetaDao;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.view.ViewGroup.LayoutParams;  
  
import android.widget.ArrayAdapter;
import android.widget.Button;  
import android.widget.EditText;  
import android.widget.LinearLayout;  
import android.widget.ScrollView;  
import android.widget.Spinner;
import android.widget.Toast;  
  
import android.widget.TextView;  
  
public class TesteCadastroColeta_2 extends Activity{  
      
    private static final String CATEGORIA = "coleta";  
      
      
        private TextView nomeInfoTipo1;  
        private TextView nomeInfoTipo2;  
        private TextView nomeInfoTipo3;  
        private TextView nomeInfoTipo4;  
        private TextView nomeInfoTipo5;  
        private EditText[] editText;  
        private EditText[] texto;  
        private EditText[] numerico;  
        private EditText[] numericoFracionario;  
        private EditText[] dataHora; 
        private Spinner[] escolha;
        
       // private List<OpcoesInfo> opcoesInfo;
           
        ColetaDao coletaDao = new ColetaDao(this);  
      
      
    public void onCreate(Bundle icicle){  
          
        super.onCreate(icicle);  
          
        Bundle extras = getIntent().getExtras();  
          
        final String idAmostra = extras.getString("idAmostra");  
          
        final List<Info> infos = coletaDao.listaColeta(idAmostra);  
          
        ScrollView s = new ScrollView(this);  
        s.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
          
        LinearLayout linearLayout = new LinearLayout(this);  
        linearLayout.setOrientation(LinearLayout.VERTICAL);  
           
         final int totalDados = coletaDao.listaColeta(idAmostra).size();  
         
         editText = new EditText[totalDados];
         texto    = new EditText[totalDados];  
         numerico = new EditText[totalDados];  
         dataHora = new EditText[totalDados];
         numericoFracionario = new EditText[totalDados];
         escolha = new Spinner[totalDados];
      
         
         for (int i = 0; i < totalDados; i++){  
              
             try{   
               
            int recuperaTipoDado = infos.get(i).getCodTipoDado();  /**RECUPERA O ID DO TIPODADO**/  
               
            int recuperaIdInfo = infos.get(i).getCodInfo(); /**RECUPERA O CDINFO**/
        
            /**CHAMA O METODO PARA POPULAR OS CAMPOS SPINNERS**/
                         
            nomeInfoTipo1 = new TextView(this);  
            nomeInfoTipo2 = new TextView(this);  
            nomeInfoTipo3 = new TextView(this);  
            nomeInfoTipo4 = new TextView(this);  
            nomeInfoTipo5 = new TextView(this);  
            
            editText[i] = new EditText(this); /**CAMPO DO TIPO TEXTO QUE RECEBERA OS SEGUINTES CAMPOS (1-TEXTO, 2-NUMERICO, 3-NUMERICO FRACIONARIO, 4-DATA E HORA)**/  
              
            texto[i] = new EditText(this); /**CAMPO DO TIPO TEXTO**/  
            numerico[i] = new EditText(this); /**CAMPO DO TIPO NUMERICO**/  
            numericoFracionario[i] = new EditText(this); /**CAMPO DO TIPO NUMERICO FRACIONARIO**/  
            dataHora[i] = new EditText(this); /**CAMPO DO TIPO **/  
              
            escolha[i] = new Spinner(this);
              
            texto[i].setWidth(50);  
            numerico[i].setWidth(50);  
            numericoFracionario[i].setWidth(50);  
            dataHora[i].setWidth(50);  
              
            switch (recuperaTipoDado) {  
              
            case 1:  
                  
                nomeInfoTipo1.setText(infos.get(i).getNomeInfo());  
                linearLayout.addView(nomeInfoTipo1);  
                editText[i] = texto[i];  
                editText[i].setText("");  
                editText[i].setHeight(40);  
                editText[i].setInputType(android.text.InputType.TYPE_CLASS_TEXT);  
                editText[i].setId(recuperaIdInfo);  
                  
                linearLayout.addView(editText[i]);  
                  
                  
            break;  
              
            case 2:  
                  
                nomeInfoTipo2.setText(infos.get(i).getNomeInfo());  
                linearLayout.addView(nomeInfoTipo2);  
                  
                editText[i] = numerico[i];  
                editText[i].setText("");  
                editText[i].setHeight(40);  
                  
                editText[i].setInputType(android.text.InputType.TYPE_CLASS_NUMBER);  
                editText[i].setId(recuperaIdInfo);  
                  
                linearLayout.addView(editText[i]);  
                  
            break;  
              
            case 3:  
                  
                nomeInfoTipo3.setText(infos.get(i).getNomeInfo());  
                linearLayout.addView(nomeInfoTipo3);  
                  
                editText[i] = numericoFracionario[i];  
                editText[i].setText("");  
                editText[i].setHeight(40);  
                  
                editText[i].setInputType(android.text.InputType.TYPE_NUMBER_FLAG_DECIMAL);  
                editText[i].setId(recuperaIdInfo);  
                  
                linearLayout.addView(editText[i]);  
                  
                  
            break;  
              
            case 4:  
                
                
                nomeInfoTipo4.setText(infos.get(i).getNomeInfo());  
                linearLayout.addView(nomeInfoTipo4);  
                  
                editText[i] = dataHora[i];  
                editText[i].setText("");  
                editText[i].setHeight(40);  
                  
                editText[i].setInputType(android.text.InputType.TYPE_CLASS_DATETIME);  
                editText[i].setId(recuperaIdInfo);  
                  
                linearLayout.addView(editText[i]);  
                  
            break;  
              
            case 5:  
                
                List<OpcoesInfo> opcInf = coletaDao.listaDadosSpinners(String.valueOf(recuperaIdInfo));
                                
                int opcoesInfo = coletaDao.listaDadosSpinners(String.valueOf(recuperaIdInfo)).size();
                                
                nomeInfoTipo5.setText(infos.get(i).getNomeInfo());
                linearLayout.addView(nomeInfoTipo5);  
                
                
                //LinearLayout lSpinner = new LinearLayout(this);
                                
                for(int d = 0; d < opcoesInfo; d++){
                                        
                    Log.i(CATEGORIA, "DADOS: " + opcInf.get(d).getNomeOpcao());
                                    
                    
                }
                
                
          
               
              ArrayAdapter adaptador = new ArrayAdapter(this, android.R.layout.simple_spinner_item, opcInf);
                
               adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                  
                escolha[i].setAdapter(adaptador);
               
               linearLayout.addView(escolha[i]);  
                  
            break;  
              
              
            } // fim swith  
              
              
        }catch (Exception ex) {  
              
            Log.i(CATEGORIA, "Exception ex" + ex + "FOR: " + (i));  
        }  
              
      
     } // fim for  
           
          
           
            LinearLayout linearLayout2 = new LinearLayout(this);  
            linearLayout2.setOrientation(LinearLayout.HORIZONTAL);  
              
            Button botaoCadastrar = new Button(this);  
            botaoCadastrar.setText("CADASTRAR");  
            linearLayout2.addView(botaoCadastrar);  
              
            Button botalVoltar = new Button(this);  
            botalVoltar.setText("VOLTAR");  
            linearLayout2.addView(botalVoltar);  
              
              
         
            /**BOTAO CADASTRAR**/  
              
            botaoCadastrar.setOnClickListener(new View.OnClickListener() {  
                  
                @Override  
                public void onClick(View v) {  
                      
                    try {  
                          
                        for (int j = 0; j <totalDados; j++)  
                        {  
                              
                            int recuperaTipoDado = infos.get(j).getCodTipoDado();  /**RECUPERA O ID DO TIPODADO**/  
                               
                            int recuperaIdInfo = infos.get(j).getCodInfo(); /**RECUPERA O CDINFO**/   
                              
                              
                            switch (recuperaTipoDado) {  
                                case 1:  
                                  
                                    if (texto[j].getText().toString().equals("")) {  
                                        Toast.makeText(TesteCadastroColeta_2.this, "DIGITE UM TEXTO!", Toast.LENGTH_SHORT).show();  
                                        Log.i(CATEGORIA, "DIGITE UM TEXTO!");  
                                    }  
                                      
                                break;  
  
                                case 2:  
                                      
                                    if(numerico[j].getText().toString().equals("")){  
                                        Toast.makeText(TesteCadastroColeta_2.this, "DIGITE UM NÚMERO INTEIRO!", Toast.LENGTH_SHORT).show();  
                                        Log.i(CATEGORIA, "DIGITE UM NÚMERO INTEIRO!");  
                                    }  
                                      
                                      
                                break;  
                                  
                                case 3:  
                                      
                                    if (numericoFracionario[j].getText().toString().equals("")) {  
                                          
                                        Toast.makeText(TesteCadastroColeta_2.this, "DIGITE UM NÚMERO FRACIONÁRIO!", Toast.LENGTH_SHORT).show();  
                                        Log.i(CATEGORIA, "DIGITE UM NÚMERO FRACIONÁRIO!");  
                                    }  
                                      
                                break;  
                                  
                                case 4:  
                                      
                                    if (dataHora[j].getText().toString().equals("")) {  
                                          
                                        Toast.makeText(TesteCadastroColeta_2.this, "DIGITE UMA DATA!", Toast.LENGTH_SHORT).show();  
                                        Log.i(CATEGORIA, "DIGITE UMA DATA!");  
                                    }  
                                      
                                break;  
                                  
                                case 5:  
                                    
                                    if (escolha[j].equals("")) {
                                        Toast.makeText(TesteCadastroColeta_2.this, "SELECIONE UMA OPÇÃO!", Toast.LENGTH_SHORT).show();
                                    }
                                      
                                break;  
                                  
                                  
                              
                            }  
                              
                            Log.i(CATEGORIA, "ID INFO: " + recuperaIdInfo);  
                              
                              
                        }  
                          
                    } catch (Exception e) {  
                          
                        Log.i(CATEGORIA, "Erro grave botao cadastroColeta" + e);  
                    }  
                      
                      
                      
                }  
                  
            });  
                      
              
            botalVoltar.setOnClickListener(new View.OnClickListener() {  
                  
                  
                @Override  
                public void onClick(View v) {  
                      
                    //telaListaAmostra();  
                      
                    Log.i(CATEGORIA, "teste btn voltar");  
                }  
  
  
            });  
              
          
            linearLayout.addView(linearLayout2);  
          
            s.addView(linearLayout);  
          
            setContentView(s);  
              
              
  
          
              
    }  
      
       
          
          
              
      
    /**voltar para a tela de listagem das amostras**/  
      
    /*private void telaListaAmostra() { 
        Intent it = new Intent(this, CadastroUsuarioController.class); 
        startActivity(it); 
         
    }*/  
      
      
}

Alguém pode me dar uma força?

Att

Tente o meu adapter que desenvolvi há alguns meses, mas que ainda não tive tempo de polir. Passei pelo mesmo problema. Repare que existe o parâmetro “CamposDescricao” que são os campos que serão mostrados no spinner.

Abraço

obs: alterei a classe

import java.lang.reflect.Field;
import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SpinnerAdapter;
import android.widget.TextView;

public class MeuSpinnerAdapter<T> extends BaseAdapter implements SpinnerAdapter {

	// private static final String TAG = "MeuAdapter";

	private List<T> lista;
	private String[] camposDescricao;
	private final static String SEPARADOR_PADRAO = " - ";

	private LayoutInflater meuLayoutInflater;

	public MeuSpinnerAdapter(Context contexto, List<T> lista,
			String[] camposDescricao) {
		this.lista = lista;
		this.camposDescricao = camposDescricao;
		this.meuLayoutInflater = (LayoutInflater) contexto
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {
		return this.lista.size();
	}

	@Override
	public T getItem(int posicao) {
		return this.lista.get(posicao);
	}

	@Override
	public long getItemId(int posicao) {
		return Long.valueOf((posicao));
	}

	@Override
	public View getDropDownView(int position, View convertView, ViewGroup parent) {
		return createResource(position, convertView, parent,
				android.R.layout.simple_spinner_dropdown_item);
	}

	@SuppressWarnings("unchecked")
	public View createResource(int posicao, View convertView, ViewGroup parent,
			int resource) {

		ViewHolder holder;

		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < this.camposDescricao.length; i++) {
			Object retorno = this.obterValorDoCampoProcurado(
					this.lista.get(posicao), this.camposDescricao[i]);
			String tmp = retorno.toString();
			sb.append(tmp);
			if (i != this.camposDescricao.length - 1) {
				sb.append(SEPARADOR_PADRAO);
			}
		}
		if (convertView == null) {
			convertView = meuLayoutInflater.inflate(resource, parent, false);
			holder = new ViewHolder();
			holder.descricao = (TextView) convertView
					.findViewById(android.R.id.text1);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		
		holder.descricao.setText(sb.toString());
		return convertView;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		return createResource(position, convertView, parent,
				android.R.layout.simple_spinner_item);
	}

	private Object obterValorDoCampoProcurado(T objeto, String campoProcurado) {
		try {

			Field campoEncontrado = objeto.getClass().getDeclaredField(
					campoProcurado);
			if (campoEncontrado.isAccessible() == false) {
				campoEncontrado.setAccessible(true);
			}
			return campoEncontrado.get(objeto);

		} catch (SecurityException e) {
			Log.e(this.getClass().getName(), campoProcurado
							+ " da classe" + objeto.getClass().getName());
		} catch (IllegalArgumentException e) {
			Log.e(this.getClass().getName(),campoProcurado + " da classe"
							+ objeto.getClass().getName());
		} catch (IllegalAccessException e) {
			Log.e(this.getClass().getName(),campoProcurado
							+ " da classe" + objeto.getClass().getName());
		} catch (NoSuchFieldException e) {
			Log.e(this.getClass().getName(), campoProcurado
							+ " da classe" + objeto.getClass().getName());
		}
		return null;
	}

	public class ViewHolder {
		public TextView descricao;
	}
}

Boa tarde irmão.

Obrigado pela força.

Posso tirar uma dúvida?

Pq não consigo lista somente o nome neste caso?

Att

Porque, por padrão, é evocado o toString do objeto.

Abraço!

Com array normal está dando certo.

O problema é qdo busco do banco.

Tem como tranformar esta linha List<OpcoesInfo> opcInf = coletaDao.listaDadosSpinners(String.valueOf(recuperaIdInfo)); em um array de strings para matar este problema?

Mas se ele virar um array de String, como você poderá ter ‘id’ e a ‘descricao’ ao mesmo tempo? :slight_smile:
Já tentou o meu adapter?
Talvez eu não tenha entendido o seu problema, desculpe.

Abraço

É tem razão.

Já tentei sim.

Cheguei a desenvolver uma classe parecida com a sua, mas para a nossa aplicação não é viável utilizar o BaseAdapter.

O Spinner está carregando todos os dados to meu toString.

Segue a imagem

É isto que não consigo arrumar.

Eu consigo carregar dados específicos de um toString?

Exemplo:

Tenho o seguinte toString


public String toString() {
		return "OpcoesInfo [codOpcao=" + codOpcao + ", nomeOpcao=" + nomeOpcao
				+ ", descricaoOpcao=" + descricaoOpcao + ", codInfo=" + codInfo
				+ "]";
	}

Nele quero pegar somente o codOpcao=" + codOpcao + " e o nomeOpcao=" + nomeOpcao+ "

Valeu por estar me ajudando amigo.

Olha, para conseguir o que você quer, ou você reescreve o seu toString, o que parece ser um problema para você, ou você faz um custom adapter como o meu ou você decora o comportamento do toString. Sem ser tendencioso, acho que criar um custom converter ou pegar carona no meu é uma boa saída.

Puxa, só li agora seu comentário a respeito de já ter tentado criar um custom adapter, sendo que esta solução foi impraticável.

De qualquer forma, segue um exemplo de uso do MeuSpinnerAdapter: abraço!

List<OpcoesInfo> opcInf = coletaDao.listaDadosSpinners(String.valueOf(recuperaIdInfo));   

this.spinnerSeuSpinner = (Spinner) findViewById(R.Configuracao.spinnerSeuSpinner);
this.spinnerSeuSpinner .setAdapter(new MeuSpinnerAdapter<OpcoesInfo>(this,
						opcInf,
						new String[] { "codOpcao", "nomeOpcao" }));

Estou tentando utilizar a sua classe e está dando o seguinte erro.

Fiz assim.


List<OpcoesInfo> opcInf = coletaDao.listaDadosSpinners(String.valueOf(recuperaIdInfo));

ArrayAdapter adaptador = new ArrayAdapter(this, android.R.layout.simple_spinner_item, opcInf);
                
adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

escolha[i].setAdapter(new MeuSpinnerAdapter<OpcoesInfo>(this, opcInf, new String[] { "codOpcao", "nomeOpcao" }));

Isso aconteceu, porque ela esta preparada apenas para id com Long (já consertei no post acima).

Cara não sei nem como te agradecer.

Muito obrigado mesmo.

Desculpe te atrapalhar amigo.

Travei feio nesta parte do projeto.

O erro está aqui.

for (int i = 0; i < this.camposDescricao.length; i++) {  
            Object retorno = this.obterValorDoCampoProcurado(  
                    this.lista.get(posicao), this.camposDescricao[i]);  
             String tmp = (retorno instanceof Long ? ((Long) retorno).toString()  : ((String) retorno));  // NESTA LINHA 
            sb.append(tmp);  
            if (i != this.camposDescricao.length - 1) {  
                sb.append(SEPARADOR_PADRAO);  
            }  

O código inicial (alterado) que eu enviei para você era apenas para ilustrar para um colega como ele poderia ser substituído por Object. Só que eu esqueci de voltar e, como não mexia há muito tempo com ele, aproveitei e melhorei.

Foi.

Eeeeeeeeeeee.

Alterei para Long conforme seu pedido e foi.

Muito obrigado cara. Valeu mesmo.

Prometo que assim que terminar este projeto vou fazer um Tutorial para o pessoal e citar o seu nome.

Só mais uma dúvida amigo.

Com como eu pego o Id dos itens para envia-los ao banco?

Putz estou muito feliz cara

Alterei a classe. Você pode voltar para inteiro se quiser.

Pegar o Id? Não precisa, você pega o objeto inteiro!!!

Veja um exemplo:

FormaDePagamento formaDePagamento = (FormaDePagamento) this.spinnerFormaDePagamento1
				.getSelectedItem();

Se quiser agradecer, melhore esta classe! Não tive tempo hábil de realizar todo polimento possível, mas a ideia esta aí! Abraço e boa sorte!

Eu só tenho uma tela no meu aplicativo, e não consigo popular um spinner com os meses do ano.

Criei o seguinte no meu string.xml:

01
02
03
04
05
06
07
08
09
10
11
12

Meu problema está nos comandos de popular o spinner chamado “messp”:

messp = (Spinner) findViewById(R.id.messp);

ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
R.array.meses_array, android.R.layout.activity_list_item);

adapter.setDropDownViewResource(android.R.layout.activity_list_item.messp);

messp.setAdapter(adapter);

Minha activity principal se chama “activity_main”.

Tentei de tudo, mas desisti, algu[em pode me ajudar?