Uno dei componenti più importanti di Android è lo spinner, ovvero la versione android della classica combobox. La gestione dello spinner può essere fatta in maniera dichiarativa o in maniera programmatica.

In maniera dichiarativa occorre definire per il nostro spinner la sua fonte dati, disponibile in una delle risorse xml. Ad esempio possiamo dichiarare uno spinner che contiene l'elenco degli anni in questo modo:

<Spinner android:id="@+id/spinnerAnnoSottoscrizione" style="@style/Spinner"  android:entries="@array/annoIscrizione" />

l'attributo id individua unicamente il nostro spinner all'interno dell'app, l'attributo style contiene le specifiche grafiche dell'oggetto e il tag entries individua l'elenco dei valori che lo spinner può assumere. Tale elenco è definito nel file strings.xml

<string-array name="annoIscrizioneLabel">

<item>2012</item>

<item>2011</item>

</string-array>

In questo modo abbiamo definito uno spinner che conterrà due voci (2012 e 2011), selezionabili dall'utente.

Possiamo ottenere lo stesso risultato programmaticamente in questo modo.

ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,  android.R.layout.simple_spinner_item  , getResources().getStringArray(R.array.annoIscrizioneLabel));

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner spinner =(Spinner) findViewById(R.id.annoIscrizioneLabel);

spinner.setAdapter( adapter );

All'interno della nostra activity recuperiamo il nostro spinner e settiamo l'adapter che fa al caso nostro. L'Adapter è un oggetto che definisce la logica di visualizzazione dello spinner e dei suoi elementi. In questo esempio ho usato il simple_spinner_item, che definisce l'aspetto grafico dello spinner, e il simple_spinner_dropdown_item, che definisce l'aspetto grafico dell'elenco mostrato per la selezione.

Se occorre modificare l'aspetto dello spinner o rendere dinamico l'elenco delle voci da mostrare la gestione programmatica è la scelta obbligata.

Android mette a disposizione adapter che soddisfano la maggior parte delle nostre esigenze, ma se il nostro layout è complesso o la logica di business è più evoluta possiamo definire un nostro adapter, estendendo una delle classi già presenti.

Per gestire l'effetto di selezione dobbiamo definire un listener, tramite la chiamata

spinner .setOnItemSelectedListener(this);

Con questa chiamata sto dicendo che l'activity è responsabile di implementare l'interfaccia OnItemSelectedListener e di conseguenza il metodo onItemSelected. Avrei potuto in alternativa definire una inner class e demandare a lei la gestione degli eventi di selezione. Personalmente scelgo cosa fare in base alla complessità della classe.

Il listener (sia inner class che activity) si attiva per ogni evento di selezione. Fate attenzione, perchè si attiva anche allo start della nostra activity, quando viene popolato il nostro oggetto.

Buona sperimentazione.