使用Android中的Checkbox从列表视图中删除多个项目

时间:2013-09-10 09:43:41

标签: android listview android-listview

您好我无法使用复选框从listview中删除多个项目。我可以从列表视图中选择多个项目,但只有所选的第一个项目被删除而其他项目没有被删除。这是我的代码。在此先感谢!

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 个答案:

答案 0 :(得分:7)

使用SparseBooleanArray获取已检查的项目,然后删除相同的项目并刷新列表视图。

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


    }
}

编辑:

尝试以下

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

        }
    });

答案 1 :(得分:0)

removeAll使用data并将要删除的元素数组传递给方法。共鸣是这样的:

例如,你有10个元素,删除第4个元素后,所有索引5-9都移动到4-8,因此你的循环不正确,因为你使用old索引。

答案 2 :(得分:0)

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

    }
});

答案 3 :(得分:0)

也许您应该尝试下面的代码。代码基于并发性。 在&#34; OnClick&#34;被称为Bremselected的事件。对ListView进行迭代,直到&#34;检查&#34;复选框成立。然后移除项目并再次调用Bremselected(有重复),新的迭代从头开始,使用&#34; size&#34;递减。

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

    }

}