Home / Programmazione / Java Android / Android Spinner da JSON
Mattepuffo

Android Spinner da JSON

Android Spinner da JSON

Oggi vediamo un altro componente importante, lo Spinner, e come riempirlo prendendo i dati dal server in formato JSON.

Lo Spinner è un menu a tendina che ci permette di scegliere tra una serie di valori.

Cominciamo con la richiesta al server per ottenere i dati:

public class Service {

    private final String remote = "http://www.sito.com/service/";
    
    public String getCausali() throws ClientProtocolException, IOException, JSONException {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(remote + "get_causali.php");
        HttpResponse response = client.execute(post);
        HttpEntity entity = response.getEntity();
        BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        reader.close();
        return sb.toString();
    }
    
}

Tramite HttpClient ci connettiamo al server e con HttpPost inviamo una richiesta POST al file specifico (che in questo caso è in PHP).

Il file sul server esegue la query e restituisce i dati in JSON (guardate qua per un esempio).

Prendiamo il contenuto e lo aggiungiamo a un oggetto StringBuffer.

A questo punto creiamo una classe wrapper che rappresenta la nostra tabella sul db; nel mio caso ho solo due campi:

  • id
  • nome

Ecco il mio esempio:

public class Causali {
    
    private int id;
    private String nome;

    public Causali(int id, String nome) {
        this.id = id;
        this.nome = nome;
    }
    
    public int getId() {
        return this.id;
    }
    
    public String getNome() {
        return this.nome;
    }
    
    @Override
    public String toString() {
        return this.nome;
    }
    
}

Questa classe ci servirà come contenitore.

 

A questo punto l'Activity:

public class SingleItemActivity  extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_item);
        new AsyncConnection().execute("");
    }
    
    private class AsyncConnection extends AsyncTask<Object, Object, Object> {
        
        private ArrayAdapter<Causali> adapter = new ArrayAdapter<Causali>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item);

        @Override
        protected Object doInBackground(Object... arg0) {
            Service s = new Service();
            try {
                JSONArray jsonArray = new JSONArray(s.getCausali());
                for(int i = 0; i < jsonArray.length(); i++) {
                    adapter.add(new Causali(jsonArray.getJSONObject(i).getInt("id"), jsonArray.getJSONObject(i).getString("nome")));
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Object result) {
            Spinner spinCausali = (Spinner) findViewById(R.id.spinCausali);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinCausali.setAdapter(adapter);
        }
    }
    
}

In avvio avviamo la classe asincrona (l'abbiamo già incontrata), che in maniera asincrona esegue la chiamata al server e riempie un ArrayAdapter<Causali>.

Come vedete nel ciclo for, per ogni ciclo creiamo un oggetto Causali passando al costruttore i dati presi da JSON.

Poi nel onPostexecute settiamo l'adapter sul nostro Spinner.

Una nota riguarda il layout impostato sullo Spinner; quello che ho scelto è uno di quelli messa a disposizione di default dall'SDK, ma se volete potete crearne uno personalizzato ovviamente.

Ricordatevi inoltre che questa Activity richiede i permessi INTERNET da impostare nel Manifest.

Ciao e buon week end!!