Como llenar un spinner con volley y mysql en android

Hoy veremos como llenar un spinner con la librería volley, este tutorial es básico pero muy revelador a la hora de trabajar con controladores spinner, les comento que es mucho mas fácil que cuando lo hacíamos con la librería de apache, si no leíste puede verlo en este siguiente enlace: poblar un spinner  , las recomendaciones acostumbradas en nuestros tutoriales es que lean desde el principio al fin y tendrán ceros errores.

Como llenar un spinner con volley y mysql en android

poblar spinner con volley

Que necesitamos para llenar nuestro spinner?

  • paciencia
  • un base de datos en mysql
  • una web services en php y json
  • una aplicación android

Bien empezamos por la base de datos se llamara, spinner y contendrá lo siguiente.

Base de datos

CREATE TABLE IF NOT EXISTS `frutas` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` varchar(90) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
);
 
INSERT INTO `frutas` (`id`, `nombre`) VALUES
(1, 'manzana'),
(2, 'uva'),
(3, 'papaya'),
(4, 'mango');

Bueno ahora seguimos con nuestra webservice, tendrá la siguiente estructura. dentro de una carpeta llamada spinner tendremos tres carpetas datos, negocio, web-services y dentro de ella los archivos como se muestra la imagen:

webservices poblar spinner

crearemos primero la Conexion.clase.php

Conexion.clase.php

<?php

    class Conexion {

        protected $dblink;
                
        function __construct() {
            $servidor = "mysql:host=localhost;dbname=spinner";
            $usuario = "root";
            $clave = "12345";
            
            $this->dblink = new PDO($servidor, $usuario, $clave);
            $this->dblink->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->dblink->exec("SET NAMES utf8");
        }
        

}

?>

Ahora nuestro Fruta.clase.php

Fruta.clase.php

<?php
    require_once '../datos/Conexion.clase.php';
    class Fruta extends Conexion{


        public function listar(){
            $sql = "SELECT * FROM frutas";
            $sentencia = $this->dblink->prepare($sql);
            $sentencia->execute();            
            return $sentencia->fetchAll(PDO::FETCH_OBJ);
        }  

    	   }
?>

Por ultimo nuestro listar-fruta.php

listar-fruta.php

<?php
    require_once '../negocio/Fruta.clase.php';
    $objFruta = new Fruta();
    $resultado = $objFruta->listar();
    $respuesta = array(
        "usuario"=>$resultado
    );
    echo json_encode($respuesta);   
?>

Si todo lo hicimos bien nos dirigimos al siguiente enlace:

http://localhost/spinner/web-services/listar-fruta.php

y obtendremos la lista de frutas:

{
    "usuario": [
        {
            "id": "1",
            "nombre": "manzana"
        },
        {
            "id": "2",
            "nombre": "uva"
        },
        {
            "id": "3",
            "nombre": "papaya"
        },
        {
            "id": "4",
            "nombre": "mango"
        }
    ]
}

Ahora continuamos con la aplicación, empezamos por los permisos que debemos agregar en nuestro AndroidManifest

<uses-permission android:name="android.permission.INTERNET"/>

debemos agregar dentro de application usesCleartextTraffic=”true”

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="true">

Luego debemos agregar la librería de volley en nuestro buil.gradle

implementation'com.android.volley:volley:1.1.0'

Continuamos con la parte gráfica de la aplicación para esto solo necesitamos agregar el controlador spinner.

activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context=".MainActivity">

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sppFrutas"
        android:layout_marginTop="65dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

Crearemos una clase llamada conexión.

conexion

public class Conexion {
    public static final String URL_WEB_SERVICES ="http://192.168.8.147/spinner/web-services/";
}

Por ultimo nuestro MainActivity con el código para extraer los datos.

MainActivity

package com.androfast.applistarspinnervolley;

import androidx.appcompat.app.AppCompatActivity;

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 com.androfast.applistarspinnervolley.datos.Conexion;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private Spinner spinner ;
    ArrayList<String> frutas;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        frutas=new ArrayList<>();
        spinner = (Spinner) findViewById(R.id.sppFrutas);
        listar();
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String fruta=   spinner.getItemAtPosition(spinner.getSelectedItemPosition()).toString();
                Toast.makeText(getApplicationContext(),fruta,Toast.LENGTH_LONG).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                // DO Nothing here
            }
        });

    }
    public void listar(){
        RequestQueue requestQueue= Volley.newRequestQueue(getApplicationContext());
        StringRequest stringRequest=new StringRequest(Request.Method.POST, Conexion.URL_WEB_SERVICES+"listar-fruta.php",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try{
                            JSONObject jsonObject=new JSONObject(response);
                            JSONArray jsonArray=jsonObject.getJSONArray("usuario");
                            for(int i=0;i<jsonArray.length();i++){
                                JSONObject jsonObject1=jsonArray.getJSONObject(i);
                                String fruta=jsonObject1.getString("nombre");
                                  frutas.add(fruta);
                            }
                            spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, frutas));
                        }catch (JSONException e){e.printStackTrace();}
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });
        int socketTimeout = 30000;
        RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        stringRequest.setRetryPolicy(policy);
        requestQueue.add(stringRequest);
    }
}

Como es de costumbre te dejo la aplicación para que la puedas descargar en el siguiente enlace aquí.

Password: www.androfast.com

6 comentarios en «Como llenar un spinner con volley y mysql en android»

  1. max

    si quisiera filtra la base ej. todas las frutas que empiecen con “M” o “m” como quedaría tu proyecto . funciona perfecto pero me falto esa parte que no puedo terminar. Gracias totales

    1. ANDROFAST Autor

      Es muy facil, para ello debes usar el método startsWith
      Entonces dentro de onResponse debes hacer una validación antes de agregarlo a tu spinner asi:

      if( fruta.startsWith("m") || fruta.startsWith("M")){
      frutas.add(fruta);
      }

      1. max

        Mil gracias…
        Y si por ejemplo quisiera agregar dentro de tu código un campo a la base sql ej. pais de procedencia (pais) y quisiera enviar vía post que me busque todas las frutas de México.
        teniendo encuentra que el usuario podría elegir de una lista estática un grupo de paises.
        Gracias por tu paciencia saludos

    1. Ricardo Javier

      Saludos, de pronto ya sabes como obtener el id del registro, ya que he visto ejemplos donde toman el nombre mas no el id del registro.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

WhatsApp chat