/ Android

Cargar Datos en un Spinner - Android

¿Que es un spinner?

Un Spinner en Android es un widget que sirve para cargar datos en forma de lista desplegable, en desarrollo web son conocidas por el nombre de ComboBox.

En este tutorial vamos a aprender a cargar datos en un Spinner, quiero decir de antemano que hay múltiples formas de realizar esta tarea, pero en este tutorial les voy a enseñar tres formas de agregar datos en un Spinner, con los cuales podrán comenzar.

Ejemplo spinner - Android

Cargar datos obtenidos desde un arreglo de strings

Para cargar datos a un Spinner desde el XML, lo único que hay que realizar es crear un array de strings en el archivo strings.xml, el cual se encuentra res > values > strings.xml. Este tipo de implementación se utiliza cunado los datos no mutaran jamas.

Ruta del archivo strings.xml

Array de strings

<string-array name="aves">
  <item>Gorrión</item>
  <item>Paucar</item>
  <item>Colibri</item>
  <item>Paloma</item>
  <item>Garza</item>
</string-array>

XML

Ahora para que funcione perfectamente, en la propiedad entries del XML del Spinner asignamos el array de strings que hemos creado @array/aves.

<Spinner
        android:id="@+id/sp_aves"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/aves"/>

Cargar datos con código

Para cargar datos desde una array, en un Spinner vamos a utilizar un adapter. Para este ejemplo usare un arreglo de strings con nombres de frutas.

XML

<Spinner
        android:id="@+id/sp_paises"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

Código

Con unas cuantas lineas de código, podremos cargar nuestros datos en el Spinner.

//Cambia esta línea de código por la ruta de tu paquete
package com.a01luisrene.tutoriales.ui;

import android.support.v7.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.a01luisrene.tutoriales.R;
import com.a01luisrene.tutoriales.io.sqlite.PaisesDataBaseHelper;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SpinnerActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
  //Variables para cargar Spinner desde un Array
  Spinner spPaises;
  String[] strFrutas;
  List<String> listaFrutas;
  ArrayAdapter<String> comboAdapter;
  String nombreFruta;

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

      //================Datos cargados desde Array=====================//
      //Hago referencia al spinner con el id `sp_frutas`
      spPaises = (Spinner) findViewById(R.id.sp_frutas);
      //Implemento el setOnItemSelectedListener: para realizar acciones cuando se seleccionen los ítems
      spPaises.setOnItemSelectedListener(this);
      //Convierto la variable List<> en un ArrayList<>()
      listaFrutas = new ArrayList<>();
      //Arreglo con nombre de frutas
      strFrutas = new String[] {"Pera", "Manzana", "Fresa", "Sandia", "Mango"};
      //Agrego las frutas del arreglo `strFrutas` a la listaFrutas
      Collections.addAll(listaFrutas, strFrutas);
      //Implemento el adapter con el contexto, layout, listaFrutas
      comboAdapter = new ArrayAdapter<>(this,android.R.layout.simple_spinner_item, listaFrutas);
      //Cargo el spinner con los datos
      spPaises.setAdapter(comboAdapter);
  }


  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
      switch (parent.getId()){
          case R.id.sp_frutas:
          		//Almaceno el nombre de la fruta seleccionada
              nombreFruta = strFrutas[position];

              Toast.makeText(this, "Nombre fruta: " + nombreFruta, Toast.LENGTH_SHORT).show();

              break;
      }
  }

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

***

##Cargar datos desde SQLite

Para poder poblar un Spinner, con datos obtenidos desde una base de datos SQLite, vamos a realizar algunas tareas que explicare a continuación.

####Crear base de datos

Vamos a crear una base de datos con el nombre `paises.db`, con una tabla `paises` al cual agregaremos los nombres de los países que cargaremos en el **Spinner**.

> Descarga el código para crear la base de datos  [SQLite -
 PaisesDataBaseHelper.java](https://gist.github.com/01luisrene/01b138446f8fad3418be1f4ebcc1ce75)

<small>**Nota:** como este no es un tutorial de SQLite almacene el código en otro lugar.</small>

####XML

```
<Spinner
        android:id="@+id/sp_paises_sql"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
```

####Agregando items al Spinner

Una vez realizado todos los pasos anteriores, lo único que queda por hacer es cargar los valores obtenidos en el **Spinner**.

```
//Cambia esta línea de código por la ruta de tu paquete
package com.a01luisrene.tutoriales.ui;

import android.support.v7.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.a01luisrene.tutoriales.R;
import com.a01luisrene.tutoriales.io.sqlite.PaisesDataBaseHelper;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SpinnerActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
  
  //Variables para cargar Spinner desde SQLite
  PaisesDataBaseHelper helper;
  Spinner spSpinnerSql;
  List<String> listaPaisesSql;
  ArrayAdapter<String> comboAdapterSql;
  String idPais, nombrePais;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_spinner);
      //================Datos cargados desde SQLite=====================//
      //Instancio la variable helper a PaisesDataBaseHelper.getInstance()
      //Sirve para poder usar los métodos y propiedades SQLite creados anteriormente
      helper = PaisesDataBaseHelper.getInstance(this);
      //Hago referencia al spinner con el id `sp_paises_sql`
      spSpinnerSql = (Spinner) findViewById(R.id.sp_paises_sql);
      //Implemento el setOnItemSelectedListener: para realizar acciones cuando se seleccionen los ítems
      spSpinnerSql.setOnItemSelectedListener(this);
      //Convierto la variable List<> en un ArrayList<>()
      listaPaisesSql = new ArrayList<>();
      //Almaceno el tamaño de la lista getAllPaises()
      int sizeListaPaises = helper.getAllPaises().size();
      //Agrego los nombres de los países obtenidos y lo almaceno en  `listaPaisesSql`
      for(int i = 0; i < sizeListaPaises; i++){
          listaPaisesSql.add(helper.getAllPaises().get(i).getNombrePais());
      }
      //Implemento el adapter con el contexto, layout, listaPaisesSql
      comboAdapterSql = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, listaPaisesSql);
      //Cargo el spinner con los datos
      spSpinnerSql.setAdapter(comboAdapterSql);

  }

  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    switch (parent.getId()){
      case R.id.sp_paises_sql:
        //Almaceno el id del país seleccionado
        idPais = helper.getAllPaises().get(position).getId();
        //Almaceno el nombre del país seleccionado
        nombrePais = helper.getAllPaises().get(position).getNombrePais();

        Toast.makeText(this, "Id país: " + idPais + " - Nombre país: " + nombrePais, Toast.LENGTH_SHORT).show();

        break;
  }

  @Override
  public void onNothingSelected(AdapterView<?> parent) {}
}
```
Luis Rene Mas Mas

Luis Rene Mas Mas

Soy desarrollador front-end, me encanta las nuevas tecnologías web, administrar este blog es mi pasatiempo favorito.

Leer Más