更改光标时如何更新ListView?

时间:2013-09-24 15:58:20

标签: android android-listview android-cursoradapter

我做的事情如下:

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

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

2 个答案:

答案 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。