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!
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. –