2011-02-21 13 views
7

Próbuję zarządzać prostą listą w aplikacji na Androida. Zawartość listy jest utrzymywana w bazie danych SQLite. Gdy użytkownik wybierze i przytrzyma określony wiersz, pojawi się menu kontekstowe z opcją "Usuń". Po wybraniu "Usuń" wiersz zostanie usunięty z bazy danych, ale widok nie zostanie odświeżony. Kiedy wycofuję się z aplikacji i wracam, odpowiedni wiersz został usunięty. Wiem, że wiersz został usunięty, to tylko ListView, który nie odświeża.Jak odświeżyć mój ListView po zmianach w bazie danych?

Oto stosowne fragmenty kodu ...

W metodzie onCreate ...

SQLiteDatabase db = tasks.getReadableDatabase(); 
Cursor cursor = db.query(TABLE_NAME, 
    new String[] { _ID, TITLE, DETAILS, }, 
    null, null, null, null, TITLE + " DESC"); 
startManagingCursor(cursor); 

ListView lv = (ListView) findViewById(R.id.list); 
lv.setAdapter(new SimpleCursorAdapter(this, 
    android.R.layout.simple_list_item_1, 
    cursor, 
    new String[] {TITLE}, 
    new int[] { android.R.id.text1} 
)); 

W metodzie onContextItemSelected ...

switch(item.getItemId()) { 
case 0: 
    SQLiteDatabase db = tasks.getWritableDatabase(); 
    ListView lv = (ListView) findViewById(R.id.list); 
    SimpleCursorAdapter adapter = (SimpleCursorAdapter) lv.getAdapter(); 
    db.delete(TABLE_NAME, "_ID=?", new String[] {adapter.getCursor().getString(0)}); 
    adapter.notifyDataSetChanged(); // Not working, clears screen and doesn't reload 
    return true; 
} 
return super.onContextItemSelected(item); 

Czego mi brakuje ?

Dzięki!

Odpowiedz

5

Pozbądź się notifyDataSetChanged() i zadzwoń pod numer requery() na swój numer Cursor. Here is a sample project demonstrując to.

+0

Dzięki! Przejrzałem kod projektu, do którego się odwołałem, i odkryłem, że muszę przechowywać kursor razem z klasą. Myślę, że go kopiowałem i przekazywałem, czyniąc metodę requery() nieskuteczną. Kiedyś zrobiłem z niego zmienną na poziomie klasy, która rozwiązała problem. –

Powiązane problemy