Programmazione Android: aggiornare una ListView popolata con CursorAdapter
Pubblico questo articolo perché nello sviluppare la mia prima applicazione Android, mi sono ritrovato a non riuscire ad aggiornare i dati presentati da una ListView quando venivano aggiunte o tolta una o più righe. Come se non bastasse sono diventato matto a trovare informazioni sulla questione, quindi pubblico la soluzione qui ad uso e consumo di tutti gli interessati. Il problema nasce perché la mia lista non è popolata a partire da un Array, ma da un Cursor, che viene mostrato nella list view tramite un’estensione della classe CursorAdapter. Tutti i tutorial dicono che per aggiornare la lista basta chiamare il metodo notifyDataSetChanged() sull’adapter, ma nel caso di un CursorAdapter non funziona. La soluzione quindi è chiamare requery() sull’istanza della classe Cursor che viene visualizzata nella lista.
Per chiarezza pubblico nel seguito un esempio di codice.
Questo il metodo onCreate dell’activity che crea la ListView:
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
// items è l'istanza di Cursor che contiene i dati da mostrare
MyAdapter myAdapter = new MyAdapter(this, items);
setListAdapter(myAdapter);
// ...
}
L’adapter che inserisce i dati nella lista è definito così:
private class MyAdapter extends CursorAdapter {
public MyAdapter(Context context, Cursor items) {
super(context, items);
}
// ... override dei metody newView e bindView ...
}
Per aggiornare la lista dopo qualche operazione su di essa, quindi, basterà chiamare il metodo requery() sull’istanza della classe Cursor che è visualizzata nella ListView:
items.requery();
Questo metodo si curerà di effettuare nuovamente la query sul database, e quindi di ricompilare la lista con i nuovi risultati.
Non c’entra con il caso in questione, ma per chi fosse interessato al magico mondo delle ListView, non posso che consigliare questo video sul tema, da una conferenza del Google I/O del 2010.
Articoli simili:

Rss