Search code examples
androidandroid-listviewandroid-cursoradapter

How to update ListView when Cursor is changed?


I do something like below:

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

However, when context menu is called and item is deleted, it is not reflected on the list view. What am I missing?


Solution

  • When you change your cursor, you need to update its content. The simplest and recommended way is to create a new cursor (if possible in a Loaded).

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

    It is not necessary to notifyDataSetChanged.