Riempire una ListView Android da XML

Mattepuffo's logo
Riempire una ListView Android da XML

Riempire una ListView Android da XML

Abbiamo visto come riempire una ListView in Android con dati in formato JSON.

Oggi vediamo come fare la stessa cosa usando l'altro formato principe per strutturare i dati: XML.

Qua useremo una Activity invece di un Fragment, ma cambia relativamente poco.

Partiamo dalla Activity:

public class MainActivity extends ListActivity {

    private ArrayList list;
    private ArrayAdapter adapter;
    private ReadXml rx;
    private ListView lv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = getListView();
        rx = new ReadXml();
        setLista();
    }

    private void setLista() {
        try {
            list = rx.readClienti(getApplicationContext(), Environment.getExternalStorageDirectory() .getAbsolutePath() + File.separator + "dati.xml" ;
        } catch (IOException e) {
        } catch (SAXException e) {
        } catch (ParserConfigurationException e) {
        }
        adapter = new ArrayAdapter(getApplicationContext(),
                android.R.layout.simple_list_item_1, list);
        lv.setAdapter(adapter);

    }

}

Abbiamo un metodo setLista che si occupa di riempire la ListView.

In questo caso abbiamo usato una delle ListView di default (simple_list_item_1); questo il layout applicato:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip" >
    </ListView>

</LinearLayout>

A questo punto vediamo la classe ReadXml, che si prende in carico il file di cui fare il parsing:

public class ReadXml {

    public ArrayList readClienti(Context context, String file)
            throws SAXException, IOException, ParserConfigurationException {
        File f = new File(file);
        ArrayList list = new ArrayList();
        list.clear();
        if (f.exists()) {
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(f);
            document.getDocumentElement().normalize();
            NodeList nodeList = document.getElementsByTagName("cliente");
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    StringBuilder sb = new StringBuilder();
                    sb.append(
                            element.getElementsByTagName("codice").item(0)
                                    .getTextContent())
                            .append("\n")
                            .append(element
                                    .getElementsByTagName("ragione_sociale")
                                    .item(0).getTextContent())
                            .append("\n")
                            .append(element.getElementsByTagName("mnemonico")
                                    .item(0).getTextContent())
                            .append("\n")
                            .append(element.getElementsByTagName("indirizzo")
                                    .item(0).getTextContent())
                            .append("\n")
                            .append(element.getElementsByTagName("telefono")
                                    .item(0).getTextContent())
                            .append("\n")
                            .append(element.getElementsByTagName("email")
                                    .item(0).getTextContent());
                    list.add(sb.toString());
                }
            }
        }
        return list;
    }

}

La modalità che ho usato qui non è il massimo, nel senso che sarebbe stato meglio suddividere i vari campi invece di usare un unico campo con uno StringBuilder; ma nel mio caso mi bastava fare così.

Enjoy!


Condividi

1 Commenti

  • Piero

    Mi è stata molto utile questo articolo. Ho un problema però, vorrei leggere i dati da un file xml che si trova online e visualizzarli in una listaview. Per caso potresti aiutarmi? Grazie

    12/11/2014

Commentami!