使用复选框删除按钮上的多个列表视图项目

Remove multiple listview items on button with checkbox

我已经搜索过这个问题。我几天前开始编码,我正在尝试创建一个动态列表视图,您可以在其中添加字符串并通过选中复选框和删除选中的选项来删除它们。

此代码有效,但它只能删除 多个 项目,如果它们是从上到下检查的。如果我开始检查底部的,然后检查顶部的,它只会删除顶部的。如果我从下到上选中所有框,它会删除顶部和底部。如果我检查中间一个而不先检查其他任何东西,它会正确删除它。

请提供力所能及的帮助。

public class Main3Activity extends AppCompatActivity {

ArrayList<String> questions = new ArrayList<String>();

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


    //listview

    //add items
    questions.add("Jag har aldrig");
    questions.add("Jag har aldrig varit");
    questions.add("Jag har aldrig2");

    //Checkboxadapters
    final ListView questionList = (ListView) findViewById(R.id.questionList);
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, questions);
    if(questionList != null) {
        questionList.setAdapter(adapter);
        questionList.setItemsCanFocus(false);
        questionList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        /*questionList.setOnItemClickListener(new AdapterView.OnItemClickListener() {  //LISTENER
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CheckedTextView ctv = (CheckedTextView)view;
                if(ctv.isChecked()){
                    Toast.makeText(Main3Activity.this, "now it is checked", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(Main3Activity.this, "now it is unchecked", Toast.LENGTH_SHORT).show();
                }
            }
        });*/
    }


    //Erasebutton listener
    final Button eraseButton = (Button) findViewById(R.id.eraseButton);
    assert eraseButton != null;
    eraseButton.setOnClickListener(new View.OnClickListener() { //erasebutton onclick
        public void onClick(View eraseButton) {
            assert questionList != null;
            SparseBooleanArray checked = questionList.getCheckedItemPositions();
            for(int i=0; i < questionList.getCount(); i++)
            {
                if(checked.get(i)) {
                    //What to do with selected listitems
                    String item = (String) questionList.getAdapter().getItem(i);
                    Toast.makeText(Main3Activity.this, String.format("Removed: %s",item), Toast.LENGTH_SHORT).show();
                    adapter.remove(questions.get(i));
                }
            }
            checked.clear();
            adapter.notifyDataSetChanged();
        }
    });



    //Nextbutton listener
    final Button returnButton = (Button) findViewById(R.id.returnButton);
    assert returnButton != null;
    returnButton.setOnClickListener(new View.OnClickListener() { //Nextbutton onclick
        public void onClick(View returnButton) {
            Intent mainMenu = new Intent(Main3Activity.this, Main2Activity.class);
            Main3Activity.this.startActivity(mainMenu);
        }
    });


}

}

当您删除项目时,总计数会发生变化,其他项目也会发生变化,因此您的循环只会正确地从列表视图中删除第一个选中的项目。您可以尝试改变循环的方向:

for(int i = questionList.getCount() - 1; i >= 0; i--)
        {
            if(checked.get(i)) {
                //What to do with selected listitems
                String item = (String) questionList.getAdapter().getItem(i);
                Toast.makeText(Main3Activity.this, String.format("Removed: %s",item), Toast.LENGTH_SHORT).show();
                adapter.remove(questions.get(i));
            }
        }

说明你的循环是如何工作的: