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!!
java anrdoid spinner json php arrayadapter a
Commentami!