【问题标题】:Remove multiple listview items on button with checkbox使用复选框删除按钮上的多个列表视图项目
【发布时间】:2016-03-15 21:21:51
【问题描述】:

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

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

请提供任何可以提供的帮助。

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);
        }
    });


}

}

【问题讨论】:

    标签: android listview button checkbox delete-row


    【解决方案1】:

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

    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));
                }
            }
    

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

    【讨论】:

    • 谢谢!改变循环的方向解决了删除问题。如果您有时间,请进一步解释为什么改变方向确实解决了问题,因为它会教我更多关于一般循环的知识并防止将来出现问题。另外,当我在循环中添加 adapter.notifyItemRemoved(i) 时,它无法解析该方法。我忘了在适配器初始化时添加一些东西吗?
    • notifyItemRemoved 适用于 RecyclerView.Adapter,不适用于您的情况 - 我的问题。我编辑了我的答案并添加了一些循环说明。希望能帮助你理解。
    • 向您致以最诚挚的问候!谢谢。
    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多