3

I want to create a custom listview in which every single row has a textview and an imageview(which i'll use to check/uncheck the list items) as shown in the following figure:

enter image description here

I want to delete multiple items from the list. How to achieve this ?? Can you please provide any tutorial or reference or link to learn this ??

Chintan Soni
  • 24,761
  • 25
  • 106
  • 174

2 Answers2

3

This is how i created my custom listview with ease:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class DeleteData extends Activity {

    Cursor cursor;
    ListView lv_delete_data;
    static ArrayList<Integer> listOfItemsToDelete;
    SQLiteDatabase database;
    private Category[] categories;
    ArrayList<Category> categoryList;
    private ArrayAdapter<Category> listAdapter;
    ImageView iv_delete;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_delete_data);

        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        manage_reload_list();

        listOfItemsToDelete = new ArrayList<Integer>();

        iv_delete = (ImageView) findViewById(R.id.imageViewDeleteDataDelete);
        iv_delete.setClickable(true);
        iv_delete.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listOfItemsToDelete.isEmpty()) {

                    Toast.makeText(getBaseContext(), "No items selected.",
                            Toast.LENGTH_SHORT).show();
                }

                else {
                    showDialog(
                            "Warning",
                            "Are you sure you want to delete these categories ? This will erase all records attached with it.");
                }
            }
        });

        lv_delete_data = (ListView) findViewById(R.id.listViewDeleteData);
        lv_delete_data.setAdapter(listAdapter);
        lv_delete_data.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                ImageView imageView = (ImageView) arg1
                        .findViewById(R.id.imageViewSingleRowDeleteData);
                Category category = (Category) imageView.getTag();

                if (category.getChecked() == false) {
                    imageView.setImageResource(R.drawable.set_check);
                    listOfItemsToDelete.add(category.getId());
                    category.setChecked(true);
                } else {
                    imageView.setImageResource(R.drawable.set_basecircle);
                    listOfItemsToDelete.remove((Integer) category.getId());
                    category.setChecked(false);
                }
            }
        });
    }

    private void showDialog(final String title, String message) {

        AlertDialog.Builder adb = new Builder(DeleteData.this);
        adb.setTitle(title);
        adb.setMessage(message);
        adb.setIcon(R.drawable.ic_launcher);
        String btn = "Ok";
        if (title.equals("Warning")) {
            btn = "Yes";
            adb.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
        }

        adb.setPositiveButton(btn, new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {

                if (title.equals("Warning")) {

                    for (int i : listOfItemsToDelete) {

                        // -------first delete from category table-----

                        database.delete("category_fields", "cat_id=?",
                                new String[] { i + "" });

                        // --------now fetch rec_id where cat_id =
                        // i-----------------

                        cursor = database.query("records_data",
                                new String[] { "rec_id" }, "cat_id=?",
                                new String[] { i + "" }, null, null, null);
                        if (cursor.getCount() == 0)
                            cursor.close();
                        else {
                            ArrayList<Integer> al_tmp_rec_id = new ArrayList<Integer>();
                            while (cursor.moveToNext())
                                al_tmp_rec_id.add(cursor.getInt(0));
                            cursor.close();

                            for (int i1 : al_tmp_rec_id) {
                                database.delete("records_fields_data",
                                        "rec_id=?", new String[] { i1 + "" });

                                database.delete("record_tag_relation",
                                        "rec_id=?", new String[] { i1 + "" });
                            }

                            // ---------delete from records_data-------

                            database.delete("records_data", "cat_id=?",
                                    new String[] { i + "" });

                            cursor.close();
                        }
                    }

                    showDialog("Success",
                            "Categories, with their records, deleted successfully.");
                } else {
                    database.close();
                    listOfItemsToDelete.clear();
                    manage_reload_list();
                    lv_delete_data.setAdapter(listAdapter);
                }
            }
        });

        AlertDialog ad = adb.create();
        ad.show();
    }

    protected void manage_reload_list() {

        loadDatabase();

        categoryList = new ArrayList<Category>();

        // ------first fetch all categories name list-------

        cursor = database.query("category", new String[] { "cat_id",
                "cat_description" }, null, null, null, null, null);
        if (cursor.getCount() == 0) {
            Toast.makeText(getBaseContext(), "No categories found.",
                    Toast.LENGTH_SHORT).show();
            cursor.close();
        } else {

            while (cursor.moveToNext()) {

                categories = new Category[] { new Category(cursor.getInt(0),
                        cursor.getString(1)) };
                categoryList.addAll(Arrays.asList(categories));
            }
            cursor.close();
        }
        listAdapter = new CategoryArrayAdapter(this, categoryList);
    }

    static class Category {

        String cat_name = "";
        int cat_id = 0;
        Boolean checked = false;

        Category(int cat_id, String name) {
            this.cat_name = name;
            this.cat_id = cat_id;
        }

        public int getId() {
            return cat_id;
        }

        public String getCatName() {
            return cat_name;
        }

        public Boolean getChecked() {
            return checked;
        }

        public void setChecked(Boolean checked) {
            this.checked = checked;
        }

        public boolean isChecked() {
            return checked;
        }

        public void toggleChecked() {
            checked = !checked;
        }
    }

    static class CategoryViewHolder {

        ImageView imageViewCheck;
        TextView textViewCategoryName;

        public CategoryViewHolder(ImageView iv_check, TextView tv_category_name) {
            imageViewCheck = iv_check;
            textViewCategoryName = tv_category_name;
        }

        public ImageView getImageViewCheck() {
            return imageViewCheck;
        }

        public TextView getTextViewCategoryName() {
            return textViewCategoryName;
        }
    }

    static class CategoryArrayAdapter extends ArrayAdapter<Category> {

        LayoutInflater inflater;

        public CategoryArrayAdapter(Context context, List<Category> categoryList) {

            super(context, R.layout.single_row_delete_data,
                    R.id.textViewSingleRowDeleteData, categoryList);
            inflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            Category category = (Category) this.getItem(position);

            final ImageView imageViewCheck;
            final TextView textViewCN;

            if (convertView == null) {

                convertView = inflater.inflate(R.layout.single_row_delete_data,
                        null);

                imageViewCheck = (ImageView) convertView
                        .findViewById(R.id.imageViewSingleRowDeleteData);
                textViewCN = (TextView) convertView
                        .findViewById(R.id.textViewSingleRowDeleteData);

                convertView.setTag(new CategoryViewHolder(imageViewCheck,
                        textViewCN));
            }

            else {

                CategoryViewHolder viewHolder = (CategoryViewHolder) convertView
                        .getTag();
                imageViewCheck = viewHolder.getImageViewCheck();
                textViewCN = viewHolder.getTextViewCategoryName();
            }

            imageViewCheck.setFocusable(false);
            imageViewCheck.setFocusableInTouchMode(false);
            imageViewCheck.setClickable(true);
            imageViewCheck.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    ImageView iv = (ImageView) v;
                    Category category = (Category) iv.getTag();

                    if (category.getChecked() == false) {
                        imageViewCheck.setImageResource(R.drawable.set_check);
                        listOfItemsToDelete.add(category.getId());
                        category.setChecked(true);
                    } else {
                        imageViewCheck
                                .setImageResource(R.drawable.set_basecircle);
                        listOfItemsToDelete.remove((Integer) category.getId());
                        category.setChecked(false);
                    }
                }
            });
            imageViewCheck.setTag(category);

            if (category.getChecked() == true)
                imageViewCheck.setImageResource(R.drawable.set_check);
            else
                imageViewCheck.setImageResource(R.drawable.set_basecircle);

            textViewCN.setText(category.getCatName());

            return convertView;
        }
    }

    private void loadDatabase() {
        database = openOrCreateDatabase("WalletAppDatabase.db",
                SQLiteDatabase.OPEN_READWRITE, null);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

            finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

Anyone who have doubts in this can ask me...

Chintan Soni
  • 24,761
  • 25
  • 106
  • 174
1

Fisrt of all make a custom adapter and row layout for your listview. Follow this link (click) for that.Then add check-box to each row.You can customize check-box to achieve like the image you have posted.To do that, check this link (click)

After creating your custom listview, you have to get the checked listview row id on checkbox click in custom adapter(inside getview method).When the user click a checkbox you have to get the clicked row id and store into an array list.Lets say, your selected id-array list is "ArrayId" and your listview items array list is "Yourarray". here is the code,

    checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

   @Override
   public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

         if(isChecked)
          {
            ArrayId.add(Yourlist.get(position));//add item position to arraylist if checked
          }
          else
          {
            ArrayId.remove(Yourlist.get(position));//remove item position from arraylist if unchecked
          }

   }
}

Then you loop through each id stored in arraylist and delete the entry.Check the code below,

for(int i=0;i<ArrayId.size();i++)
{
  Yourlist.remove(ArrayId[i]);
}

Now the items from your listview items array-"Yourlist" will be removed.Then invalidate the listview with updated "Yourlist" array.

Community
  • 1
  • 1
Basim Sherif
  • 5,384
  • 7
  • 48
  • 90