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

Android ListView da JSON

Android ListView da JSON

In un precedente articolo vi avevo mostrato come riempire uno Spinner in Android prendendo i dati in remoto in formato JSON.

Oggi vedremo come fare la stessa operazione con una ListView, che però inseriremo in un Fragment.

La base di partenza per i Fragment dentro a un Tab la potete trovare qua.

Adesso andremo a riempire il nostro Fragment con una ListView.

Prima però andiamo a prendere la classe Service per il recupero dei dati:

public class Service {

    private final String remote = "http://www.example.com/";
    
    public String login(String user, String pwd) throws ClientProtocolException, IOException {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(remote + "login.php");
        List nameValuePairs = new ArrayList(2);
        nameValuePairs.add(new BasicNameValuePair("user", user));
        nameValuePairs.add(new BasicNameValuePair("pwd", pwd));
        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = client.execute(post);
        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line;
        String result = null;
        while ((line = reader.readLine()) != null) {
            result = line;
        }
        reader.close();
        return result;
    }
    
    public String getLastItems(String phpFile) throws ClientProtocolException, IOException, JSONException {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(remote + phpFile);
        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();
    }

}

Questo è il metodo che ci servirà nel Fragment, metodo a simile a quello spiegato in altri articoli, quindi non mi ci soffermo.

 

A questo punto andiamo a vedere il nostro Fragment:

public class EntriesFragment extends ListFragment {
    
    private ListView lv = null;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_fragment, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        lv = getListView();
        new AsyncConnection().execute("");
    }
    
    private class AsyncConnection extends AsyncTask {

        private ArrayList> list = new ArrayList>();
        
        @Override
        protected Object doInBackground(Object... params) {
            try {
                Service service = new Service();
                JSONArray jsonArray = new JSONArray(service.getLastItems("last_entries.php"));
                for(int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jo = jsonArray.getJSONObject(i);
                    HashMap map = new HashMap();
                    map.put("id", jo.getString("id"));
                    map.put("valore", jo.getString("valore"));
                    map.put("causale_id", jo.getString("causale_id"));
                    map.put("causale", jo.getString("causale"));
                    map.put("conto_id", jo.getString("conto_id"));
                    map.put("conto", jo.getString("conto"));
                    map.put("data", jo.getString("data"));
                    map.put("note", jo.getString("note"));
                    list.add(map);
                }
            } catch (ClientProtocolException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            } catch (JSONException ex) {
                ex.printStackTrace();
            }
            return null;
        }
        
        @Override
        protected void onPostExecute(Object result) {
            ListAdapter adapter = new SimpleAdapter(getActivity(), list, R.layout.list_items, new String[] { "id", "valore", "causale_id", "causale", "conto_id", "conto", "data", "note" },
                    new int[] { R.id.txt_id, R.id.txt_valore, R.id.txt_causale_id, R.id.txt_causale, R.id.txt_conto_id, R.id.txt_conto, R.id.txt_data, R.id.txt_note });
            lv.setAdapter(adapter);
        }
        
    }

}

Prima di tutto la nostra classe estende la classe ListFragment.

Nel metodo onCreateView carichiamo un layout che vi posterò dopo.

Nel metodo onActivityCreated invece richiamiamo la nostra classe asincrona per interrogare il server.

Quello che facciamo è riempire un ArrayList con una HashMap; questa struttura ci serve per il ListAdapter che andiamo ad impostare nel metodo onPostExecute.

Qui richiamimo un altro layout dove andremo a visualizzare i valori che vogliamo.

Il primo layout, quello generico del Fragment, è questo:


    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
            android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

 

Molto semplice.

Invece il layout richiamato dopo, che serve appunto per vedere tutti i valori:


    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

            android:id="@+id/txt_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" >
   

            android:id="@+id/txt_valore"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip"
        android:textColor="@android:color/holo_blue_light" >
   

            android:id="@+id/txt_causale_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" >
   

            android:id="@+id/txt_causale"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" >
   

            android:id="@+id/txt_conto_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" >
   

            android:id="@+id/txt_conto"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" >
   

            android:id="@+id/txt_data"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip" >
   

            android:id="@+id/txt_note"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" >
   

 

Io ne ho nascosti alcuni; questo sta a voi ovviamente.

Di sicuro il tutto non è proprio semplicissimo, bisogna che vi andiate a studiare qualche classe di quelle usate sulla ottima documentazione ufficiale.

Ma vedrete che il meccaniscmo di base è semplice!