Consultas retornados em uma Spinner

Bom dia Pessoal.

Preciso de uma ajuda. Estou desenvolvendo um projeto para o Android, é um Sistema de Vendas para o TCC da faculdade. Porém como não sou muito conhecedor da linguagem java, estou tendo um pouco de dificuldades para fazer uma consulta.

Tenho a classe Pedido.clas, Item.class e produto.class, cada uma delas possui um DAO, o meu problema é o seguinte, eu não estou conseguindo fazer uma consulta que retorne valores para uma Spinner.

Exemplo. Eu cadastro o pedido, e em seguida preciso cadastrar os produtos nesse pedido, sendo que o pedido só possui os campos cliente e data, então chamo a tela de produto que possui os seguintes campos: Nº Pedido(Spinner), descricao(Spinner), valor(Spinner), quantidade(EditText). A spinner de pedido eu consigo ter retorno através do construor da clase modelo Pedido.class.
Como reaizo as outras consultas para que possa aparecer os dados nas Spinner?

Ex: Spinner descricao listar todos os produtos da tabela produto, Spinner valor listar todos os valores cadastrados no banco, etc.

Des de Já obrigado pela ajuda!

Classe DAO de Pedido

public class PedidoDAO extends SQLiteOpenHelper{

	private static final int VERSAO = 1	;
	private static final String TABELA = "pedido";
	
	public PedidoDAO(Context context){
		super (context, TABELA, null, VERSAO);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		builder.append(" CREATE TABLE " + TABELA + " ");
		builder.append(" (codigo_pedido INTEGER PRIMARY KEY,");
		builder.append(" cliente TEXT, ");
		builder.append(" data TEXT, ");
		builder.append(" valor_total INTEGER); ");
		//builder.append(" FOREIGN KEY (codigo_pedido)REFERENCES item(codigo_pedido_id);");
		db.execSQL(builder.toString());
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		builder.append(" DROP TABLE IF EXISTS " + TABELA);
		db.execSQL(builder.toString());
		onCreate(db);
	}
	
	public void inserir(Pedido pedido){
		ContentValues values = new ContentValues();
		values.put("cliente", pedido.getCliente());
		values.put("data",pedido.getData());
		values.put("valor_total", pedido.getValorTotal());
		getWritableDatabase().insert(TABELA, null, values);
	}
	
	private static final String[] COLS = {"codigo_pedido", "cliente", "data", "valor_total"};
	
	String selection = null;
	String[] selectionArgs = null;
	String groupBy = null;
	String having = null;
	String orderBy = null;
	
	public List<Pedido>getLista(){
		List<Pedido>pedidos = new ArrayList<Pedido>();
		
		Cursor c = getWritableDatabase().query(TABELA, COLS, selection, selectionArgs, groupBy, having, orderBy);
		
		while (c.moveToNext()){
			Pedido pedido = new Pedido();
			pedido.setCodigoPedido(c.getLong(0));
			pedido.setCliente(c.getString(1));
			pedido.setData(c.getString(2));
			pedido.setValorTotal(c.getString(3));
			pedidos.add(pedido);
		}
		c.close();
		return pedidos;
	}
	
	public void delete(Pedido pedido){
		getWritableDatabase().delete(TABELA, "codigo_pedido = ?", new String[]{pedido.getCodigoPedido().toString()});
	}
}

Classe DAO de Item

public class ItemDAO extends SQLiteOpenHelper{

	private static final int VERSAO = 2;
	private static final String TABELA = "item";
	
	public ItemDAO(Context context){
		super(context, TABELA, null, VERSAO);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		builder.append(" CREATE TABLE " + TABELA + " ");
		builder.append(" (codigo_item INTEGER PRIMARY KEY, ");
		builder.append(" codigo_pedido_id INTEGER, ");
		builder.append(" codigo_produto_id INTEGER");
		builder.append(" quantidade INTEGER); ");
		db.execSQL(builder.toString());
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		builder.append(" DROP TABLE IF EXISTS " + TABELA);
		db.execSQL(builder.toString());
		onCreate(db);
	}
	
	public void inserir(Item item){
		ContentValues values = new ContentValues();
		values.put("codigo_item", item.getCodigoItem());
		values.put("codigo_pedido_id", item.getCodigoPedido());
		values.put("codigo_produto_id", item.getCodigoProduto());
		values.put("quantidade", item.getQuantidade());
		getWritableDatabase().insert(TABELA, null, values);
	}
	
	private static final String[] COLS = { "codigo_item", "codigo_pedido_id", "codigo_produto_id", "quantidade"};
	
	String selection = null;
	String[] selectionArgs = null;
	String groupBy = null;
	String having = null;
	String orderBy = null;
	
	public List<Item>getLista(){
		List<Item>itens = new ArrayList<Item>();
		
		Cursor c = getWritableDatabase().query(TABELA, COLS, selection, selectionArgs, groupBy, having, orderBy);
		
		while (c.moveToNext()){
			Item item = new Item();
			item.setCodigoItem(c.getLong(0));
			item.setCodigoPedido(c.getLong(1));
			item.setCodigoProduto(c.getLong(2));
			item.setQuantidade(c.getInt(4));
			itens.add(item);
		}
		c.close();
		return itens;
	}
	
}

Classe DAO de Produto

public class ProdutoDAO extends SQLiteOpenHelper {

	private static final int VERSAO = 2;
	private static final String TABELA = "produto";

	public ProdutoDAO(Context context) {
		// TODO Auto-generated constructor stub
		super(context, TABELA, null, VERSAO);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		builder.append(" CREATE TABLE " + TABELA + " ");
		builder.append(" (codigo_produto INTEGER PRIMARY KEY, ");
		builder.append(" descricao TEXT, ");
		builder.append(" preco TEXT); ");
		// builder.append(" FOREIGN KEY (codigo_produto)REFERENCES item(codigo_produto_id);");
		db.execSQL(builder.toString());
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		builder.append(" DROP TABLE IF EXISTS " + TABELA);
		db.execSQL(builder.toString());
		onCreate(db);
	}

	public void inserir(Produto produto) {
		ContentValues values = new ContentValues();
		values.put("descricao", produto.getDescricao());
		values.put("preco", produto.getPreco());
		getWritableDatabase().insert(TABELA, null, values);
	}

	private static final String[] COLS = { "codigo_produto", "descricao",
			"preco" };

	String selection = null;
	String[] selectionArgs = null;
	String groupBy = null;
	String having = null;
	String orderBy = null;

	public List<Produto> getLista() {
		List<Produto> produtos = new ArrayList<Produto>();

		Cursor c = getWritableDatabase().query(TABELA, COLS, selection,
				selectionArgs, groupBy, having, orderBy);

		while (c.moveToNext()) {
			Produto produto = new Produto();
			produto.setCodigoProduto(c.getLong(0));
			produto.setDescricao(c.getString(1));
			produto.setPreco(c.getString(2));

			produtos.add(produto);
		}
		c.close();
		return produtos;
	}
}

XML da Tela de Produto.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
        <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="1">
            <TableRow android:layout_width="wrap_content" android:gravity="center" android:layout_height="wrap_content">
                <ImageView
                	android:layout_height="wrap_content"
                	android:layout_width="wrap_content"
                	android:src="@drawable/produto"/>
            </TableRow>
            <TableRow android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content">
                <TextView
                	android:text="@string/item_itens"
                	android:layout_width="wrap_content"
                	android:textSize="25sp"
                	android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
                <TextView
                	android:text="@string/item_pedido"
                	android:layout_width="wrap_content"
                	android:layout_height="wrap_content"
                	android:layout_gravity="center_vertical"/>
                <Spinner
                	android:id="@+item/spinnerPedido"
                	android:layout_width="wrap_content"
                	android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
                <TextView
                	android:text="@string/item_produto"
                	android:layout_width="wrap_content"
                	android:layout_gravity="center_vertical"
                	android:layout_height="wrap_content"/>
                <Spinner
                	android:id="@+item/spinnerProduto"
                	android:layout_width="wrap_content"
                	android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
                <TextView
                	android:text="@string/item_valor"
                	android:layout_width="wrap_content"
                	android:layout_gravity="center_vertical"
                	android:layout_height="wrap_content"/>
                <Spinner
                	android:id="@+item/spinnerValor"
                	android:layout_width="wrap_content"
                	android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
                <TextView
                	android:text="@string/item_quantidade"
                	android:textAppearance="?android:attr/textAppearanceSmall"
                	android:layout_height="wrap_content"
                	android:layout_width="wrap_content"/>
                <EditText
                	android:layout_height="wrap_content"
                	android:inputType="number"
                	android:layout_width="wrap_content"
                	android:id="@+item/editTextQuantidade">
                </EditText>
            </TableRow>
            <Button
            	android:text="Inserir Produto"
            	android:id="@+item/buttonInserirProduto"
            	android:layout_width="wrap_content"
            	android:layout_height="wrap_content"/>
            <Button
            	android:text="Sair"
            	android:id="@+item/buttonSair"
            	android:layout_width="fill_parent"
            	android:layout_height="wrap_content"/>
        </TableLayout>
    </LinearLayout>
    
</ScrollView>

Tá mas onde está o Activity que carrega esse xml?

É nesse Activity que o spinner tem que ser relacionado com o cursor para mostrar as informações.

no teu xml você criou o spinner.

Nos DAOs vc coleta as informações em Cursors, mas em nenhum lugar você ligou um com o outro.

Olhem esse código de Activity abaixo: Nele vocês vão encontrar a declaração da Spinner, o carregamento e até a manipulação dos eventos dela:


public class DatabaseActivity extends Activity {
	
	private BancoManager bco;
	private Intent iLista, iInsere, iTabela, iImporta;
	private Spinner spTabelas;
	
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);                       
        
        spTabelas = (Spinner)findViewById(R.id.spinner1);
        
		ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.tabelas, android.R.layout.simple_spinner_item);
		
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spTabelas.setAdapter(adapter);		
		
        Button btInserir = (Button) findViewById(R.id.btInserir);
		Button btListar = (Button) findViewById(R.id.btListar);
		Button btTabela = (Button) findViewById(R.id.btTabela);
		Button btImportar = (Button) findViewById(R.id.btImportar);		
		
		iInsere = new Intent(this, InserirDadosActivity.class);
		iLista = new Intent(this, ListaDadosActivity.class);
		iTabela = new Intent(this, TabelaActivity.class);
		iImporta = new Intent(this, ImportaActivity.class);
		
		btListar.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				String sSpinner = (String)spTabelas.getSelectedItem();  
				if(sSpinner.equalsIgnoreCase(""))
					msgEscolherTabela();  
				else{
					//passando um parametro para a activity chamada
					iLista.putExtra("tabela", sSpinner);
					startActivity(iLista);
				}
			}
		});
		
		btInserir.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				String sSpinner = (String)spTabelas.getSelectedItem();  
				if(sSpinner.equalsIgnoreCase(""))
					msgEscolherTabela();  
				else{
					//passando um parametro para a activity chamada
					iInsere.putExtra("tabela", sSpinner);
					startActivity(iInsere);
				}								
			}
		});
		
		btTabela.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				String sSpinner = (String)spTabelas.getSelectedItem();  
				if(sSpinner.equalsIgnoreCase(""))
					msgEscolherTabela();  
				else{
					//passando um parametro para a activity chamada
					iInsere.putExtra("tabela", sSpinner);
					startActivity(iTabela);
				}								
			}
		});
		
		btImportar.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {				
		        startActivity(iImporta);				
			}
		});
    }
    
    public void msgEscolherTabela(){ Toast.makeText(this, "Selecione a tabela desejada.", Toast.LENGTH_LONG).show();}
    
}

João.

Cara…segue a Classe que chama a Activity

Nela só consigo retornar o Numero do Pedido. Os outros não consegui fazer. Por falta até de conhecimento creio eu!.
Então eu queria fazer as consultas pra poder persistir os dados que o usuário no caso selecionar.

Segue a classe.

public class ConsultaProduto extends Activity{
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.item_produto);
		
		Spinner spPedido = (Spinner)findViewById(R.item.spinnerPedido);
		Spinner spProduto = (Spinner)findViewById(R.item.spinnerProduto);
		Spinner spValor = (Spinner)findViewById(R.item.spinnerValor);
		EditText quantidade = (EditText)findViewById(R.item.editTextQuantidade);
		
		//retornando Id de pedido
		PedidoDAO dao = new PedidoDAO(this);
		List<Pedido>pedidos = dao.getLista();
		dao.close();
		
		ArrayAdapter<Pedido>adapter = new ArrayAdapter<Pedido>(this, android.R.layout.simple_spinner_item, pedidos);
		spPedido.setAdapter(adapter);
		
		
	}
	
}

Mas não é o caso apenas de repetir a dose do que você fez com o Pedido???

//retornando Id de pedido   
PedidoDAO dao = new PedidoDAO(this);   
List<Pedido>pedidos = dao.getLista();   
dao.close();   
           
ArrayAdapter<Pedido>adapter = new ArrayAdapter<Pedido>(this, android.R.layout.simple_spinner_item, pedidos);   
spPedido.setAdapter(adapter);   
        //retornando Id de produto   
        ProdutoDAO dao2 = new ProdutoDAO(this);   
        List<Produto>produtos = dao2.getLista();   
        dao2.close();   
           
        ArrayAdapter<Produto>adapter2 = new ArrayAdapter<Produto>(this, android.R.layout.simple_spinner_item, produtos);   
        spProduto.setAdapter(adapter2);   

E assim por diante. Ou tem algo que não to enxergando?

Pois é cara…
Pensei nisso tb…mas ai a spinner me retorna um endereço de memória.
Se eu for na classe Produto e colocar um método toString tipo:

public String toString() {
		// TODO Auto-generated method stub
		return descricao;
	}

Com isso até funcionaria, mas ai eu precisaria colocar mais um método toString na classe por causa do campo de valor. Ou seja. Não daria certo porque a classe não aceita outro metodo toString

Se eu fizer do jeito que vc colocou a consulta fica duplicada, as duas Spinner ficam com o mesmo resultado. Fiz um teste aqui.

Acho que tenho que criar um método na classe ProdutoDAO, mas não sei como fazer.

@Edit
me tira uma duvida… Pedido, produto e valor estao na mesma tabela???

Sim Caio.

Pois precisarei persistir esses dados em uma tabela, que será referente a produto.

Por que vc não pode usar nomes de metodos diversos, diferentes de toString???

//retornando Id de pedido   
        PedidoDAO dao = new PedidoDAO(this);   
        List<Pedido>pedidos = dao.getLista();   
        dao.close();   
           
        ArrayAdapter<Pedido>adapter = new ArrayAdapter<Pedido>(this, android.R.layout.simple_spinner_item, pedidos);   
        spPedido.setAdapter(adapter);   

Você coloca no teu adapter os objetos pedidos, ao invés de simplesmente colocar neles apenas a descrição montada, seria bem mais fácil.

Daí sim você poderia usar o método com o nome que quiser. É claro que se você coloca um Pedido na hora de mostrar o sistema automaticamente procura toString;

Minha idéia é fazer algo mais detalhado, assim:



//retornando Id de pedido   
        PedidoDAO dao = new PedidoDAO(this);   
        List<Pedido>pedidos = dao.getLista(); 

        List<String> descricoes = new List<String>();
        //FAZ UM FOR MONTA DAS DESCRIÇOES A PARTIR DAS INFORMACOES DOS PEDIDOS
        //ADICIONA NA LISTA descricoes
 
        //OU PODE FAZER COM QUE LA NO DAO JÁ VENHA A LISTA COM ESSAS DESCRICOES
        dao.close();   
           
        //E faz com que o adaptador se reporte a lista descricoes
        ArrayAdapter<String>adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, descricoes);   
        spPedido.setAdapter(adapter);   

Bom joão…
Até entendi…

Mas por falta de conhecimento da minha parte, não sei como criar esse método no DAO para me retornar o resultado desejado.
Minha dificuldade está justamente nessa construção de método.

Simplesmente não sei como fazer. rs

Tá, a verdade que eu te dei a solução sem testar realmente.

Vou colocar as tuas classes no meu eclipse e tentar olhar sério para a solução.

Você poderia postar as classes base, Pedido, Produto, … ?

Claro.

Segue…

Essa é a Pedido.Class

public class Pedido {

	
	private Long codigoPedido;
	private String cliente;
	private String data;
	private String valorTotal;
	
	public Long getCodigoPedido() {
		return codigoPedido;
	}
	public void setCodigoPedido(Long codigoPedido) {
		this.codigoPedido = codigoPedido;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public String getValorTotal() {
		return valorTotal;
	}
	public void setValorTotal(String string) {
		this.valorTotal = string;
	}
	public String getCliente() {
		return cliente;
	}
	public void setCliente(String cliente) {
		this.cliente = cliente;
	}
		
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return codigoPedido + " - " + cliente;
	}	
}

Essa é a Produto.class

public class Produto {

	private Long codigoProduto;
	private String descricao;
	private String preco;
	
	public Long getCodigoProduto() {
		return codigoProduto;
	}
	public void setCodigoProduto(Long codigoProduto) {
		this.codigoProduto = codigoProduto;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getPreco() {
		return preco;
	}
	public void setPreco(String preco) {
		this.preco = preco;
	}
	
}

Falta a classe Item

Desculpa João.

Segue

public class Item{

	private Long codigoItem;
	private Long codigoPedido;
	private Long codigoProduto;
	private int quantidade;
	
	public Long getCodigoItem() {
		return codigoItem;
	}
	public void setCodigoItem(Long codigoItem) {
		this.codigoItem = codigoItem;
	}
	public Long getCodigoPedido() {
		return codigoPedido;
	}
	public void setCodigoPedido(Long codigoPedido) {
		this.codigoPedido = codigoPedido;
	}
	public Long getCodigoProduto() {
		return codigoProduto;
	}
	public void setCodigoProduto(Long codigoProduto) {
		this.codigoProduto = codigoProduto;
	}
	public int getQuantidade() {
		return quantidade;
	}
	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}
}

Você não mandou a classe Item, mas foi fácil montá-la a partir do set e gets que apareciam na ConsultaProduto.

Bem, não tem problema nenhum, basta mesmo só colocar um toString em cada classe base Pedido, Produto e Item (Não nos DAOs).

A partir daí, quando o spinner for mostrar ele procura o to String e mostra aquilo que você definiu para ser mostrado lá.

Então ficou assim:

Na classe Produto:

public String toString() { return codigoProduto + " - " + descricao + " - " + preco; }

na Classe Pedido:

public String toString() {   
        return codigoPedido + " - " + cliente + " - " + data + " - " + valorTotal;   
    }

e Na classe Item:

public String toString() {   
        return getCodigoItem + " - " + getCodigoPedido + " - " + getCodigoProduto + " - " + getQuantidade;   
    }

Mas já vou falando que você precisa melhorar um pouco o teu relacionamento entre objetos.

Modelagem, orientação a objetos tem sempre a ver com representar a vida real.

Então Um pedido tem vários ítens e cada ítem tem um produto.

Tudo bem que você separou os 3 em classes bases, mas essa relação já podia estar dentro de cada uma.

Na classe pedidos, já poderia ter a lista de Itens.

E na classe Item já podeira ter um objeto Produto.

Isso evita tantos códigos. Deixe os códigos para o banco, quando você trabalha em nível de objeto,
buscou no banco, criou o objeto, já vai criando dentro dele os objetos respectivos. Fica muito mais
fácil de gerenciar tudo depois.

Então tua classe de Produto ta legal e correta. Ela carrega um codigo de um produto, sua descricao e seu preço.

Já a classe de Item, ao inves de ter o codigo de produto, precisa mesmo é ter um produto dentro. E não precisa
ter o codigo do pedido pois os itens vão estar dentro de uma lista dentro do objeto Pedido, assim:


public class Item {

                private codigo codigo;	
	private Produto produto;
	private int quantidade;
	

E a classe de Pedido deve conter uma lista de Itens e não um código de Item, assim:


public class Pedido {
	private Long codigoPedido;   
    private List<Item>itens;   

O código do cliente também não tem nada a ver. O certo seria no objeto Cliente ter uma lista de
pedidos. Esse código aqui não tem nada a ver.

E o valor total é uma informação que deve ser obtida através de um método, não faz sentido armazenar
ela num atributo. Se precisa colocar ela na descrição, coloca o método de obtenção na string do ToString.

Entao no final vc tem essas classes, o teu activity chama o DAO, ele cria uma série desses objetos e vai
colocando uns dentro dos outros usando as listas e retorna um objeto Pedido ou uma lista de Pedidos
que cada um deles tem vários itens que tem produtos.

Orientação a objetos é representar a vida real num sistema. Quando olho esses sistemas fico imaginando
que nunca ninguem explicou isso para vocês jovens.

Desculpem o desabafo. Sou professor a muitos anos. E as vezes cansa.

Muito obrigado João.

E me desculpe qualquer coisa…
Mas o que acontece é que no nível acadêmico, são ensinados o básico do básico.
E dificilmente você vê alguem passar um bom exemplo utilizando mais de uma tabela, fazendo relacionamentos e tal. A consistência que aprendemos só é a partir de uma classe pra uma tabela… ai quando precisamos fazer algo mais complexo… caímos na dúvida e recorremos a Internet…que as vezes acaba por complicar mais ainda.

Mas valeu mesmo!!

Não se preocupe, você tem razão, as faculdades costumam ensinar menos até do que os cursos de programação.

É uma pena. Os professores deveriam exigir que o aluno se virasse com o básico e a partir disso o professor se
dedicaria a criar com eles um grande sistema, de nível comercial mesmo, algo que até pudesse ser usado.

O problema é que há professores que também não sabem, eles querem mesmo é dar aulinhas bem basicas. kkkkk

Bem, espero que você consiga colocar as informações nos teus spinners, qualquer coisa, continuamos vigiando o
tópico e se precisar podemos tentar ajudar mais um pouco.