我做的事情如下:
public class WhitelistActivity extends ListActivity {
private DbAdapter dbHelper;
private SimpleCursorAdapter adapter;
private Cursor recordsCursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whitelist);
dbHelper = new DbAdapter(this);
dbHelper.open();
recordsCursor = dbHelper.fetchWhitelistRecords();
startManagingCursor(recordsCursor);
String[] from = new String[]{DbAdapter.KEY_W_SENDER};
int[] to = new int[]{R.id.text1};
adapter = new SimpleCursorAdapter(this, R.layout.whitelist_row, recordsCursor, from, to);
setListAdapter(adapter);
...
@Override
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()) {
case CONTEXT_MENU_DELETE_ID:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
dbHelper.deleteWhitelistRecord(info.id);
adapter.changeCursor(recordsCursor);
adapter.notifyDataSetChanged();
return true;
}
return super.onContextItemSelected(item);
}
但是,当调用上下文菜单并删除项目时,它不会反映在列表视图中。我错过了什么?
答案 0 :(得分:2)
在重新查询数据库之前,不会更新Cursor。 startManagingCursor不会自动执行此操作。 adapter.notifyDataSetChanged()“更新”ListView,但由于Cursor没有改变,所以没有任何反应。
你应该真正考虑做的是将数据库封装在ContentProvider中,然后使用CursorLoader来管理Cursor和requeries。如果你这样做,生活变得更加简单。请参阅Loading Data in the Background以了解如何设置CursorLoader。在ContentProvider中封装数据库也很简单,请参阅API指南 Creating a Content Provider
答案 1 :(得分:0)
更改光标时,需要更新其内容。最简单和推荐的方法是创建一个新游标(如果可能,在一个已加载中)。
recordsCursor = dbHelper.fetchWhitelistRecords();
adapter.changeCursor(recordsCursor);
没有必要notifyDataSetChanged。