Elementos gráficos – Spinner
Los spinners son elementos a de selección de lista a los que se asocia una lista de datos. Por lo tanto este tipo de controles está dividido en dos partes: la parte visual que se representa mediante un desplegable y la parte de datos que se representa mediante un adaptador. Al igual que el spinner, otros elementos como las listas o las listas con cartas utilizan este tipo de estructura para representar un elemento completo. Existen multitud de adaptadores pero inicialmente utilizaremos un objeto de tipo ArrayAdapter ya que es el tipo más simple para poder asociar datos a un objeto.
Spinner
Como se ha dicho, el spinner es un desplegable que permite seleccionar un dato concreto sobre una lista de opciones. Para poder representar un spinner gráficamente:
1 2 3 4 5 |
<Spinner android:elevation="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/spinner"/> |
En este caso las propiedades asociadas al spinner no suelen ser muy grandes, de utilizar alguna sería la de entries que se comentará en el siguiente apartado. Si llevamos el elemento a código java los principales métodos son:
1 2 3 4 5 6 7 8 |
//asocia los datos al elemento spinner.setAdapter(new ArrayAdapter()); //obtiene la lista de datos asociada al elemento spinner.getAdapter(); //devuelve el objeto seleccionado del spinner spinner.getSelectedItem(); //devuelve la posición del objeto seleccionado (empezando por 0) spinner.getSelectedItemPosition(); |
La mayoría de métodos comentados hacen referencia a acceso a datos, pudiendo ser más efectivo el acceso al adaptador que ahora se comentará
Asociar datos a un Spinner – Adaptadores
Los adaptadores representan los datos que se asocian a un elemento de selección. La estructura y asociación de esto es común para cualquier elemento que tenga parte gráfica y parte de datos. Para ello se pueden utilizar adaptadores de diferente tipo, entre los que están:
- ArrayAdapter: adaptador más simple de todos, donde tan solo se asocia una lista de datos con una apariciencia determinada
- SimpleAdapter y BaseAdapter: adaptador parecido al anterior pero con una personalización mayor con una vista propia
- SimpleCursorAdapter: adaptador que se utiliza para asociar datos procedentes de base de datos de forma semi-directa
Construir y asociar adaptadores
Como ya se ha comentado un adaptador es un conjunto de datos que se asocia a un elemento de selección – lista. Para poder crear un adaptador se necesita una lista de datos, una vista que será la que tengan los datos que se van a mostrar y un contexto determinado. La lista de datos puede ser desde un array simple hasta un map que pueda asocia objeto a clave. Para poder manera con comodidad los datos y hacer la lista de opciones dinámica se utilizará una lista de tipo List representada mediante una ArrayList
1 2 3 4 |
ArrayList listaDatos = new ArrayList(); for (int i = 1; i<11;i++){ listaDatos.add("Opción "+String.valueOf(i)); } |
Para la vista, en este primer ejemplo se utilizará una que el propio android nos ofrece en su librería que muestra un elemento dentro de la lista: android.R.layout.simple_list_spinner_item. Por último como contexto se utilizará el de la propia Activity mediante un objeto de tipo this. Una vez se tienen todos los elementos se construye el objeto de tipo ArrayAdapter
1 2 3 4 |
ArrayAdapter adapterSpinner = new ArrayAdapter(this,android.R.layout.simple_spinner_item,listaDatos); adapterSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapterSpinner); |
Además de asociar el adaptador al spinner con los datos que se han comentado antes, también se ha personalizado el aspecto de cada uno de los elementos cuando la lista está desplegada mediante el método setDropDownView y el layout que android nos otorga.
Otra opción para rellenar los datos del spinner es la de utilizar la propiedad entries del layout, apuntando a un recurso de tipo array que esté creado
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="datos_spinner_simple"> <item>Opción 1</item> <item>Opción 2</item> <item>Opción 3</item> <item>Opción 4</item> <item>Opción 5</item> </string-array> </resources> |
1 2 3 4 5 |
<Spinner android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/spinner" android:entries="@array/datos_spinner_simple"/> |
o mediante código
1 2 |
ArrayAdapter adapterSpinner = new ArrayAdapter(this,R.array.datos_spinner_simple,android.R.layout.simple_spinner_item); |
Una vez hecho esto el spinner está configurado tanto por parte gráfica como por parte de datos.
Si llevásemos el adaptador a código java, los métodos más utilizados serían:
1 2 3 4 5 6 7 8 9 |
//método que notifica al adaptador que algo ha cambiado en la parte de datos //este método siempre se tienen que ejecuatra cuando se añade/borra/modifican datos adapterSpinner.notifyDataSetChanged(); //devuelve el numero de elementos asociados adapterSpinner.getCount(); //devuelve el elementos asociado a una posición concreta adapterSpinner.getItem(); //devuleve el id del elemento asociado a una posción concreta adapterSpinner.getItemId(); |
De esta forma y con los métodos asociados tanto al spinner como al adaptador se podría saber en un momento determinado cual es el elemento seleccionado dentro de un spinner:
1 |
adapterSpinner.getItem(spinner.getSelectedItemPosition() |
Manejo de eventos en un Spinner
Para poder evaluar el elemento seleccionado de forma automática en el momento de la selección, se utiliza el listener OnItemSelectedListener con los métodos asociados onItemSelected() onNothingSelected()
1 2 3 4 5 6 7 8 9 10 11 |
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id){ //Ejecuatado cuando la selección cambie } @Override public void onNothingSelected(AdapterView<?> parent) { //Ejecutado cuando se ejecuta la activity } }); |
Los métodos se ejecutarán cuando cambien la selección y cuando el spinner no tenga nada seleccionado. Los parámetros que tienen los métodos son:
- parent: la vista donde se llevo a cabo la selección
- view: la vista completa que generó el evento
- position: la posición del elemento seleccionado
- id: el id de la fila donde está el elemento seleccionado
Con estos datos, se podría obtener cualquier dato del elemento seleccionado de la siguiente forma
1 2 3 4 5 6 7 8 9 10 11 12 13 |
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id){ //Ejecuatado cuando la selección cambie Toast.makeText(getApplicationContext(), String.valueOf(parent.getAdapter().getItem(position)),Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { //Ejecutado cuando se ejecuta la activity Toast.makeText(getApplicationContext(),"Posición inicial",Toast.LENGTH_SHORT).show(); } }); |
