2011-11-21 16 views
5

Ehi, utilizzo un listview per dimostrare le voci memorizzate in un database. Ho anche un elemento EditText e un pulsante che aggiunge il contenuto di EditText al Database. Per associare la vista del contenuto del database a utilizzare la funzione Popola SimpleCursorAdapter e seguente:Aggiornamento Android ListView con SimpleCursorAdapter

private void populate() { 
    cursor = dbAdapter.getAllItems(); 
    startManagingCursor(cursor); 

    String[] from = new String[] { DBAdapter.KEY_TASK }; 
    int[] to = new int[] { android.R.id.text1 }; 

    // Now create an array adapter and set it to display using our row 
    cursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, from, to); 
    list.setAdapter(cursorAdapter); 
} 

Se ho aggiunto una nuova voce, facendo clic sul pulsante voglio aggiornare la listview ma questo funziona solo con la funzione Popola e non con la comune funzione adattatore notifyDataSetChanged();. Ho un bug o è questo il modo giusto per aggiornare un listview?

risposta

8

Avete visto this, provato il metodo swap cursor o provato semplicemente a chiamare nuovamente setAdapter()?

Avevo un problema simile a quello in cui non riuscivo ad aggiornare la mia lista e quello che ho fatto è stato creare un metodo refreshListView(). Ora puoi chiamarlo inizialmente dal tuo onCreate(), E ogni volta che un utente aggiunge qualcosa al DB. Tutto ciò che fa è re-associare la listview a un cursore. Con tutti i metodi deprecating (requery()) e problemi con notifyDataSetChanged(), ho deciso che questo era il modo più semplice.

+0

Solo per menzionare: 'requery()' è già obsoleto. [Documentazione] (http://developer.android.com/reference/android/database/Cursor.html#requery()) ha un chiaro record su questo. – 87element

+0

Lo so, non ho pronunciato la frase giusta, l'ho riformulata:> – Jack

+0

Hey Jack grazie per la tua risposta, vedo che ho dimenticato di dire che il codice sopra è la mia funzione 'populate()' la chiamo in il mio metodo 'onCreate()' e se clicco sul pulsante "Aggiungi". Volevo solo sapere se questa è una buona soluzione per chiamare questo metodo invece di chiamare il metodo comune 'notifyDataSetChanged()' della classe dell'adattatore di base. –

2

Si veda questo link ... funziona come fascino

Update SimpleCursorAdapter while maintaining scroll position in ListView

per ListView dinamica sul rotolo ho aggiunto nuovo elemento dal database .. ho fatto errore qui .. ero assegnazione di nuovi adapter per ogni volta per lo stesso simplecursoradapter. Invece di creare un nuovo adattatore. basta usare

adapter.changecursor(newcursorValue); 
adapter.notifydatasetChanged(); 
lsMedicine1.setSelectionFromTop(lsMedicine1.getLastVisiblePosition()-20, 0); 
1

È necessario chiamare swapcursor() prima notifyDataSetChanged() sull'adattatore.

Problemi correlati