How to control item deletion in CursorAdapter

I am currently facing a stupid problem. I have a list with a custom adapter (extension CursorAdapter).

Displays a custom view with different buttons (sharing, such as deleting). For the delete button, it has an alertdialog to confirm the removal of the item. When the user confirms, the item is removed from db. Everything is working fine while here.

My question is, how can I effectively update my list with my new dataset?

Many thanks for your help.

The code:

public class CommentCursorAdapter extends CursorAdapter{
    (...)
    @Override
    public void bindView(View view, Context arg1, Cursor cursor) {
    (...)
        holder.list_item_comment_discard_btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            final String _id = v.getTag().toString();
            AlertDialog.Builder builder = new    AlertDialog.Builder(mActivity);
            builder.setTitle("Delete");
            builder.setMessage("Do you want to delete "+_id);
            builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User clicked OK button
                    DBAdapter dba = new DBAdapter(mActivity);
                    dba.open();
                    dba.remove(_id);
                    Log.i("TAAG", "removed: "+_id);
                    dba.close();    

                // How to update the listview ??                                    
                }
            });
            builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User cancelled the dialog
                }
            });

            AlertDialog d = builder.create();
            d.show();
        }
        });
        holder.list_item_comment_discard_btn.setTag(_id);
        (...)
    }
    (...)
}
+5
source share
4 answers

LoaderManager ( ), restartLoader, (re) onLoadFinished. .

:

  • :

    public void onCreate(Bundle savedInstanceState) { // or onStart
    // ...
    this.getLoaderManager().initLoader(MY_CURSOR_ID, null, this);
    // ...
    }
    
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // TODO: create a cursor loader that will load your cursor here
    }
    
    public void onLoadFinished(Loader<Cursor> arg0, final Cursor arg1) {
    // TODO: set your cursor as the cursor of your adapter here;
    }
    
    public void onLoaderReset(Loader<Cursor> arg0) {
    // TODO: set null as the cursor of your adapter and 'free' all cursor
    // references;
    }
    
  • , :

    this.getLoaderManager().restartLoader(MY_CURSOR_ID, null, this);
    
+9

cursor.requery(); notifyDataSetChanged(); .

, AsyncTaskLoader.

+1

Cursor :

public void onClick(DialogInterface dialog, int id) {
    // User clicked OK button
    DBAdapter dba = new DBAdapter(mActivity);
    dba.open();
    dba.remove(_id);
    Log.i("TAAG", "removed: "+_id);
    dba.close();    
    cursor.requery();
    notifyDataSetChanged();                                   
}   

notifyDataSetChanged(), Adapter, , .

, . .

+1
source

After deleting the item in the database, call notifyDataSetChangedon your own CommentCursorAdapter, provided by this anonymous inner class that you use, you will need a finallink to this, since this is inside yours CursorAdapter. This should trigger an update of yours ListView.

http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged ()

+1
source

All Articles