Spinner enlazados en Android, en el que un segundo Spinner
carga sus contenidos en función del ítem seleccionado del primer Spinner
.
Los pasos que he seguido para conseguirlo han sido:
- Creación de arrays dentro del archivo
strings.xml
. - Creación de la vista en el archivo
layout.xml
. - Declaración de variables.
- Referenciado de variables del XML.
- Construcción del "adaptador" para el primer
Spinner
. - Cargar el tipo de vista para el adaptador.
- Aplicar el adaptador al
Spinner
de localidades. - Listener para saber que item ha sido seleccionado y poder usarlo en el método
onItemSelected
. - Sobre escribir el método
onItemSelected
de la interfazOnItemSelectedListener
.- Se guarda en array de enteros los arrays de las provincias.
- Construcción del adaptador para el segundo
Spinner
. - Se carga el tipo de vista para el adaptador.
- Se aplica el adaptador al
Spinner
de localidades.
Creación de los arrays para los Spinner
:
<string-array name="array_provincias">
<item>Sevilla</item>
<item>Málaga</item>
</string-array>
<string-array name="array_sevilla">
<item>Villanueva del Ariscal</item>
<item>Tomares</item>
<item>Mairena del Aljarafe</item>
</string-array>
<string-array name="array_malaga">
<item>Casares</item>
<item>Manilva</item>
<item>Estepona</item>
</string-array>
Creación de Spinner en la vista:
<Spinner
android:id="@+id/spinnerProvincia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp" />
<Spinner
android:id="@+id/spinnerLocalidad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/spinnerProvincia"
android:layout_centerHorizontal="true"
android:layout_marginTop="66dp" />
Declaración y referenciado de los Spinner
:
//Declaración de variables
private Spinner spinnerPro, spinnerLoc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Referenciado de variables del XML
spinnerPro = (Spinner) findViewById(R.id.spinnerProvincia);
spinnerLoc = (Spinner) findViewById(R.id.spinnerLocalidad);
/*------ Método OnCreate continua ------*/
Adaptador para primer Spinner
:
@Override
protected void onCreate(Bundle savedInstanceState) {
/*------ Método continuado ------*/
//Construcción del "adaptador" para el primer Spinner
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this,
R.array.array_provincias, //Se carga el array definido en el XML
android.R.layout.simple_spinner_item);
//Se carga el tipo de vista para el adaptador
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//Se aplica el adaptador al Spinner de localidades
spinnerPro.setAdapter(adapter);
//Se aplica listener para saber que item ha sido seleccionado
//y poder usarlo en el método "onItemSelected"
spinnerPro.setOnItemSelectedListener(this);
}
Segundo Spinner
, enlazado:
//Sobre escrito el método "onItemSelected" de
//la interfaz "OnItemSelectedListener"
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//Se guarda en array de enteros los arrays de las provincias
int[] localdades = {R.array.array_sevilla,R.array.array_malaga};
//Construcción del "adaptador" para el segundo Spinner
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this,
localidades[position],//En función de la provincia, se carga el array que corresponda del XML
android.R.layout.simple_spinner_item);
//Se carga el tipo de vista para el adaptador
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//Se aplica el adaptador al Spinner de localidades
spinnerLoc.setAdapter(adapter);
}
He creado un vídeo en el que realizo este ejemplo de Spinner enlazados en Android: