Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

notifyDataSetChanged in Curser adapter not working with listfragment

I have a listfragment that displays a list from a database. I have everthing working correctly except for a small item that I can't seeem to clear up. The list view looks something like this.

-----------------------------------------------------
text text text | some more text | delete row button |
-----------------------------------------------------

My problem: when a user presses the delete row button the row is deleted from the database but will not be removed from the screen until the activity is stopped and started again.

I know that notifyDataSetChanged() is the preferred method for updating these lists but it does not seem to do anything... Anyhow, below is my code for the cursor adapter where notifyDataSetChanged() is called.

public class CalcCursorAdapter extends SimpleCursorAdapter{

    private Context mContext;
    private ListView mListView;
    private int mLayout;
    private Cursor mcursor;

    protected static class ViewHolder {
        protected TextView text;
        protected ImageButton button;
        private int position;
      }


    @SuppressWarnings("deprecation")
    public CalcCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) 
    {
        super(context, layout, c, from, to);
        this.mContext = context;
        this.mLayout = layout;
        this.mcursor = c;

        //mListView = .getListView();

    }       

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView summary = (TextView)view.findViewById(R.id.calctvPrice);
        TextView savings = (TextView)view.findViewById(R.id.calctvSavings);
        TextView percentOff = (TextView)view.findViewById(R.id.calctvpercentOff);
        summary.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcFinalPrice")));




    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        ViewHolder holder = new ViewHolder();

        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.calc_list_item, parent, false);

        holder.button = (ImageButton) v.findViewById(R.id.qcbtnDelete);
        holder.button.setOnClickListener(deleteButton);
        holder.position = cursor.getInt(cursor.getColumnIndexOrThrow("_id"));
        bindView(v, context, cursor);
        v.setTag(holder);


        return v;

    }

    private OnClickListener deleteButton = new OnClickListener() {
        @SuppressWarnings("deprecation")
        public void onClick(View v){
            View view = (View) v.getParent();
            ViewHolder holder = (ViewHolder) view.getTag();
            int position = holder.position;
            DbHelper mDbHelper;
            mDbHelper = new DbHelper(mContext);
            mDbHelper.open();
            mDbHelper.deleteCalc(position);
            mDbHelper.close();
            String test = Integer.toString(position);
            Toast.makeText(mContext.getApplicationContext(), test, Toast.LENGTH_SHORT).show();  
            notifyDataSetChanged();



            //ListView list = getListView();


        }
    };

    public long qcItemId(int position) {

        return position;
    }




}

Thank you for your help.

UPDATE:

New button Code within my adapter:

private OnClickListener deleteButton = new OnClickListener() {
    @SuppressWarnings("deprecation")
    public void onClick(View v){
        v.invalidate();
        View view = (View) v.getParent();
        view.invalidate();
        ViewHolder holder = (ViewHolder) view.getTag();
        int position = holder.position;
        DbHelper mDbHelper;
        mDbHelper = new DbHelper(mContext);
        mDbHelper.open();
        mDbHelper.deleteCalc(position);
        mDbHelper.close();
        String test = Integer.toString(position);
        Toast.makeText(mContext.getApplicationContext(), test, Toast.LENGTH_SHORT).show();  
        Cursor newCursor = getCursor();
        changeCursor(newCursor);
        notifyDataSetChanged();



        //ListView list = getListView();


    }
};
like image 783
Marek Counts Avatar asked May 29 '13 00:05

Marek Counts


1 Answers

I got the same problem before, I don't think in this case notifyDataSetChanged alone can help you. What has changed is actually your cursor, so you need to reload it using the function changeCursor on your custom adapter. Here is an example:

changeCursor(yourCursor);
notifyDataSetChanged();

Here is the full code of how I managed this in my Fragment class:

ImageButton newCat = (ImageButton)categoriesListTitle.findViewById(R.id.new_category);

            newCat.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(final View v) {
                    categoriesDialog.dismiss();

                    AlertDialog.Builder newCatAlert = new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.AlertDialogStyle));

                    newCatAlert.setTitle("New category");

                    // Set an EditText view to get user input 
                    final EditText newCatET = new EditText(v.getContext());
                    newCatAlert.setView(newCatET);

                    newCatAlert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            String newCatName = newCatET.getText().toString();

                            db.addCategory(newCatName);
                            mAdapter.changeCursor(db.getAllCategoriesByRate(currentRate));//Here I update the cursor used in my adapter
                            //In your case (you do not use a dialog), you have to add this line I think:
                            //mAdapter.notifyDataSetChanged();

                            categoriesDialog.show();
                        }

                    });

                    newCatAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            dialog.cancel();
                        }
                    });
                    newCatAlert.show();
                }
            });


            categoriesLV.setAdapter(mAdapter);
like image 172
Yoann Hercouet Avatar answered Oct 20 '22 08:10

Yoann Hercouet