2011-02-21 21 views
7

私はAndroidアプリケーションで単純なリストを管理しようとしています。リストの内容はSQLiteデータベースで管理されます。ユーザーが特定の行を選択して保持すると、コンテキストメニューに「削除」オプションが表示されます。 「削除」を選択すると、その行はデータベースから削除されますが、ビューは更新されません。アプリケーションから戻ってきて、適切な行が削除されました。だから、私は行が削除されていることを知っている、それはちょうどリフレッシュしないListViewです。ここでデータベースの変更後にListViewを更新するにはどうすればよいですか?

はコードの関連ビットは、私が何をしないのです

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); 

... onContextItemSelected方法で

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} 
)); 

... ...のonCreateメソッドで

です?

ありがとうございます!

答えて

5

notifyDataSetChanged()を取り除き、requery()Cursorに電話してください。これを実証するHere is a sample project

+0

ありがとうございます!私が参照したプロジェクトコードを見て、クラスでCursorを保存する必要があることを発見しました。私はそれをコピーして渡していると思うので、requery()メソッドは効果がありません。いったんクラスレベルの変数にすると、そのトリックが実行されました。 –

関連する問題