Search code examples
androidlistviewsimplecursoradapter

How can I set up button onclicklistner when using simple cursor adapter


  • Here is the code I am using to show a custom ListView using simple CursorAdapter
  • I am using this code to show cart items, and I want to add button in ListView
  • As I am new to android development I'm not able to figure out what the problem is

myDbHelper.openDataBase();

    final Cursor ictemp = myDbHelper.getOrdredItems(myDbHelper);
    if (ictemp != null) {

        ictemp.moveToFirst();
        count = ictemp.getCount();
        Log.d("count", "count===" + count);

        String[] from = new String[] { "item_name", "item_rate", "qty",
                "unit" };
        int[] to = new int[] { R.id.tv_Name, R.id.tv_Rate, R.id.et_qty,
                R.id.tv_unit };

        final SimpleCursorAdapter sc = new SimpleCursorAdapter(this,
                R.layout.list_row2, ictemp, from, to, 0);

        final Cursor crs = myDbHelper.getTotal(myDbHelper);
        if (crs != null) {

            crs.moveToFirst();

            String total = crs.getString(0);
            Gtotal.setText("Rs." + total);
            tvcount.setText("" + count);



        }

        lv.setAdapter(sc);

        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View view,
                    final int pos, long arg3) {


                remove = (Button) arg0.findViewById(R.id.btn_remove);
                switch (arg0.getId()) {

                case R.id.btn_remove:

                    Toast.makeText(ctx, "Clicked on " + pos,
                            Toast.LENGTH_SHORT).show();

                    break;}



            }
        });

Solution

  • One solution is to create a CustomAdapter that extends SimpleCursorAdapter.
    Then override bindView method
    In bindView, find the Button then handle onClickEvent

    public class CustomAdapter extends SimpleCursorAdapter {
    
        private Context mContext;
        private Context appContext;
        private int layout;
        private Cursor cr;
        private final LayoutInflater inflater;
    
        public CustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
            super(context, layout, c, from, to);
            this.layout = layout;
            this.mContext = context;
            this.inflater = LayoutInflater.from(context);
            this.cr = c;
        }
    
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return inflater.inflate(layout, null);
        }
    
        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            super.bindView(view, context, cursor);
            ...
            TextView tv_Name = (TextView) view.findViewById(R.id.tv_Name);
            tv_Name.setText(...);
            ...
            Button btnRemove = (Button) view.findViewById(R.id.btn_remove);
            btnRemove.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // button click
                    // Remove your item here 
    
                }
            });
        }
    }
    

    Use it in Activity by

     final CustomAdapter sc = new CustomAdapter(this,R.layout.list_row2,ictemp, from, to, 0);
     lv.setAdapter(sc)
    

    Hope this helps