Removing multiple items from a list using a checkbox in Android

Hi, I am stuck in removing multiple items from a list using a checkbox. I can select several items from the list, but only the first item that is selected is deleted, and the other items are not deleted. Here is my code. Thanks at Advance!

public class MainActivity extends Activity { ListView lv; ArrayAdapter<String> adapter; Button delete; ArrayList<String> data = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView)findViewById(R.id.listView1); delete = (Button)findViewById(R.id.button1); data.add("Windows"); data.add("Android"); data.add("Apple"); data.add("Blackberry"); adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, data); lv.setAdapter(adapter); delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { deleteCheckedItems(); adapter.notifyDataSetChanged(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } private void deleteCheckedItems() { int count = adapter.getCount(); for (int i = 0; i < count; i++) { if (lv.isItemChecked(i)) { data.remove(i); } } } } 
+4
source share
4 answers

Use a SparseBooleanArray to get the marked items, then delete them and refresh the list.

 public class MainActivity extends Activity { ListView lv; ArrayAdapter<String> adapter; Button delete; ArrayList<String> data = new ArrayList<String>(); SparseBooleanArray mCheckStates ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); lv = (ListView)findViewById(R.id.listView1); lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); delete = (Button)findViewById(R.id.button1); data.add("Windows"); data.add("Android"); data.add("Apple"); data.add("Blackberry"); adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, data); lv.setAdapter(adapter); delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SparseBooleanArray checked = lv.getCheckedItemPositions(); for (int i = 0; i < lv.getCount(); i++){ if (checked.get(i)==true) { data.remove(i); } adapter.notifyDataSetChanged(); } lv.clearChoices(); } }); } } 

Edit:

Try below

  delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SparseBooleanArray checkedItemPositions = lv.getCheckedItemPositions(); int itemCount = lv.getCount(); for(int i=itemCount-1; i >= 0; i--){ if(checkedItemPositions.get(i)){ adapter.remove(data.get(i)); } } checkedItemPositions.clear(); adapter.notifyDataSetChanged(); } }); 
+7
source

Use removeAll for data and pass an array of elements to be removed into the method. This resonance is as follows:

for example, you have 10 elements, after deleting the 4th element, all indexes 5-9 move to 4-8, so your loop is wrong because you are using old indexes.

0
source
 delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SparseBooleanArray checkedItemPositions = lv.getCheckedItemPositions(); int itemCount = lv.getCount(); for(int i=0; i <itemCount; i++){ if(checkedItemPositions.get(i)){ adapter.remove(data.get(i)); --i; } } checkedItemPositions.clear(); adapter.notifyDataSetChanged(); } }); 
0
source

Perhaps you should try the code below. The code is based on reloading. After the OnClick event, Bremselected is called. The ListView repeats until the "checked" checkbox is selected. Then the element is deleted, and at another time (there is reprocessing) Bremselected is called, and a new iteration starts from scratch with decreasing size.

 public void Bremselected(View v) { final int size=lv.getChildCount(); /// lv=(ListView) for(int i=0;i<size;i++){ CheckBox mchb=(MCheckBox) lv.getChildAt(i); if(mchb.isChecked()){ lv.removeViewAt(i); Bremselected(v); break; } } 

}

0
source

Source: https://habr.com/ru/post/1501437/


All Articles