Como posso recuperar o id de um produto no spinner?

Boa tarde,

Como posso recuperar o id de um produto no spinner?

Tenho o spinner.xml com os campos txvNome, txvPreco, txvID.

Preencho o spinner assim:

Spinner spProdutos = (Spinner) findViewById(R.id.spProdutos);
SQLiteDataBase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE", null);
Cursor cursor = db.rawQuery("SELECT * FROM produtos ORDER BY nome ASC",null);
String[] from = { "_id ", "nome", "preco"};
int[] to = {R.id.txvID, R.txvNome, R.id.txvPreco};
SimpleCursorAdapter ad = new SimpleCursorAdapter (getBaseContext(), R.layout.spinner, cursor, from,  to);
spProdutos.setAdapter(ad);

eu faço na gambiarra isso daí…

por exemplo, eu alimento o spinner com o valor “30 - PRODUTO1 - R$5,99”…

daí eu quando quero pegar o primeiro valor ali, eu pego a string inteira que tá selecionada no spinner (SpinContrato.getSelectedItem().toString()), daí faço uma função pra ler caractere por caractere até que encontre o espaço, e retorno o que foi lido…

ex:

public String RetornaNum(String str){
Integer i = 0;
String str2 = “”;
String buff = “”;

	while (!str2.equals(" ")) {
		str2 = str.substring(i, i+1);
		if (!str2.equals(" ")) {
			buff = buff + str2;
		}
		i++;
	}
	return buff;
}

essa função aí pega o primeiro campo até o primeiro espaço, e retorna a variavel buff que alimentei até antes de encontrar o espaço… entendeu?

Entendi sim. Não teria um meio mais prático? Preencher somente pelo nome e pegar o id?

saryoromulo,

no seu exemplo, como que preenche o spinner e como é a chamada do método?

Eu fiz assim, mas está retornando 0 (zero) no primeiro item, onde está errado?

package br.com.spinner;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.List;
import java.util.ArrayList;

public class SpinnerIdActivity extends Activity {

private Spinner spn1;
private List<String> nomes = new ArrayList<String>();
private String nome;
private String[] id;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

	//Adicionando Nomes no ArrayList
	nomes.add("João");
	nomes.add("Maria");
	nomes.add("José");
	nomes.add("Paulo");
	nomes.add("Adriana");

	//Identifica o Spinner no layout
	spn1 = (Spinner) findViewById(R.id.spinner1);
	//Cria um ArrayAdapter usando um padrão de layout da classe R do android, passando o ArrayList nomes
	ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, nomes);
	ArrayAdapter<String> spinnerArrayAdapter = arrayAdapter;
	spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
	spn1.setAdapter(spinnerArrayAdapter);

	//Método do Spinner para capturar o item selecionado
	spn1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

		@Override
		public void onItemSelected(AdapterView<?> parent, View v, int posicao, long id) {
			//pega nome pela posição
			nome = parent.getItemAtPosition(posicao).toString();
			//imprime um Toast na tela com o nome que foi selecionado
			Toast.makeText(SpinnerIdActivity.this, "Nome Selecionado: " + nome, Toast.LENGTH_LONG).show();
			Toast.makeText(SpinnerIdActivity.this, "id selecionado :" + posicao, Toast.LENGTH_SHORT).show();
		}

		@Override
		public void onNothingSelected(AdapterView<?> parent) {

		}
	});

}

}

Suponha que tenha a tabela abaixo com os campos id e nome. Quero preencher um spinner com o campo nome e ao selecionar um nome, mostrar o id correspondente num textView.

id = 1
nome = a

id = 2
nome = b

id = 3
nome = c

Exemplo:
Selecionei o nome b no spinner e me mostrar o id = 2.

Alguém poderia ajudar?

Ninguém???

Meus amigos, fiz do jeito abaixo mas não está mostrando no Toast o id ao selecionar o item no spinner. O que está errado?

		Spinner spn = (Spinner) findViewById(R.id.spinner1);
		
    	String nomeString = Procurar.getText().toString();
    	Cursor cursor;	
		db.open();
	    cursor = db.getClientePorNome(nomeString);
	    cursor.moveToFirst();
        SimpleCursorAdapter adaptador = new SimpleCursorAdapter(this, R.layout.mostrabanco2, cursor, new String[] {DbAdapter.KEY_NOME}, new int[] {R.id.lblCampo1});
        spn.setAdapter(adaptador);
		spn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View v, int posicao, long ids) {
				Toast.makeText(Lista.this, "ID Selecionado: " + posicao, Toast.LENGTH_LONG).show();
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
		});
	    db.close();

Boa tarde a todos, preciso preencher um spinner com dados vindo do sqlite e mostrar o id do selecionado num editText ou txtView, alguém poderia me ajudar? Até consegui fazer mas não mostra no Toast quando clica no spinner, o que está errado?

Spinner spn = (Spinner) findViewById(R.id.spinner1);
         
        String nomeString = Procurar.getText().toString();
        Cursor cursor;  
        db.open();
        cursor = db.getClientePorNome(nomeString);
        cursor.moveToFirst();
         
        SimpleCursorAdapter adaptador = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursor, 
                new String[] { DbAdapter.KEY_NOME }, 
                new int[] { android.R.id.text1 });             
         
         
         
        adaptador.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
         
        spn.setAdapter(adaptador);
         
        spn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
 
            @Override
            public void onItemSelected(AdapterView<?> parent, View v, int posicao, long ids) {
                Toast.makeText(Lista.this, "ID Selecionado: " + posicao, Toast.LENGTH_LONG).show();
            }
 
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub
                 
            }
        });
        db.close();

Quero que o id seja o que está no banco de dados, não do spinner.

Alguém para me ajudar?

Me deram essa dica, mas não entendi direito o que fazer:

Você passou o Cursor diretamente para o Spinner, eu sugiro que você crie um Objeto modelo, faça um método separado para executar a consulta ao Banco e inserir em uma Lista de objetos, tipo o exemplo abaixo:

List<Time> times = new ArrayList<Time>();
 
     if (c.moveToFirst()) {
 
          int idxId = c.getColumnIndex(Times._ID);
          int idxNome = c.getColumnIndex(Times.NOME);
 
               do {
 
                    Time time = new Time();
                    time.setId(c.getLong(idxId));
                    time.setNome(c.getString(idxNome));
                    times.add(time);
 
               } while (c.moveToNext());
 
          }
 
return times;

Onde ?c.moveToFirst()? o ?C? é o objeto Cursor, então fazemos um do-while para inserir os dados em uma lista, com essa Lista você pode passar ele pelo Spinner e depois recuperar esses dados sem precisar fazer uma nova consulta ao Banco!

Essa dica ai, mas o que eu faço? Me ajudem, por favor.

Não seria melhor criar um Adapter ?
Tem um exemplo aqui, mas da pra adapta-lo a sua necessidade.

http://www.androidbrasilprojetos.org/android/adapter-personalizado-custom-adapter/

Não utiliza banco. Preciso de algum exemplo que venha do banco.

Aqui está a resposta para sua dúvida: http://aqueleblogdeandroid.blogspot.com.br/2011/02/utilizando-spinner-com-objetos.html