0

我做如下的事情:

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

但是,当调用上下文菜单并删除项目时,它不会反映在列表视图中。我错过了什么?

4

2 回答 2

2

在您重新查询数据库之前,不会更新光标。startManagingCursor 不会自动执行此操作。adapter.notifyDataSetChanged() “更新” ListView,但由于 Cursor 没有改变,所以什么也没有发生。

真正应该考虑做的是将您的数据库封装在 ContentProvider 中,然后使用 CursorLoader 来管理 Cursor 和请求。如果你这样做,生活就会变得简单得多。请参阅在后台加载数据以了解如何设置 CursorLoader。将数据库封装在 ContentProvider 中也很简单,请参阅 API 指南 创建 Content Provider

于 2013-09-24T19:00:27.857 回答
0

当你改变你的光标时,你需要更新它的内容。最简单且推荐的方法是创建一个新游标(如果可能在 Loaded 中)。

recordsCursor = dbHelper.fetchWhitelistRecords();
adapter.changeCursor(recordsCursor);

没有必要通知DataSetChanged。

于 2013-09-26T07:45:54.220 回答