5

嗨,我坚持使用复选框从列表视图中删除多个项目。我可以从列表视图中选择多个项目,但只有第一个被选中的项目被删除,而其他项目没有被删除。这是我的代码。提前致谢!

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

4 回答 4

8

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

        }
    });
于 2013-09-10T10:26:59.213 回答
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();

    }
});
于 2014-04-30T09:29:59.617 回答
0

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

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

于 2013-09-10T09:57:03.870 回答
0

也许你应该试试下面的代码。该代码基于递归。在“OnClick”事件之后,调用 Bremselected。迭代 ListView 直到建立“选中”复选框。然后删除 item 并再次调用 Bremselected (存在重复),新的迭代从头开始,“大小”减小。

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

    }

}

于 2017-08-31T17:36:11.277 回答