【问题标题】:Removing muliple items from listview using Check box in Android使用Android中的复选框从列表视图中删除多个项目
【发布时间】:2013-09-10 09:43:40
【问题描述】:

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

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

}

【问题讨论】:

    标签: android listview android-listview


    【解决方案1】:

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

    【讨论】:

    • 感谢 Raghunandan 的回复..但它不会删除选定的项目..如果我选择两个项目..它会删除我选择的第一个和下一个项目
    • @Giridharan 它工作正常我刚刚测试过。我没有看到问题
    • @Raghunanadan:逻辑对我来说不能正常工作..我只使用你的逻辑 raghu..:(
    • @Giridharan 将再次交叉检查
    • @Raghunandan 可以发布适配器类的删除方法
    【解决方案2】:

    removeAll 用于data,并将要删除的元素数组传递给方法。原因是这样的:

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

    【讨论】:

      【解决方案3】:
      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();
      
          }
      });
      

      【讨论】:

        【解决方案4】:

        也许你应该试试下面的代码。该代码基于递归。 在“OnClick”事件之后,调用 Bremselected。迭代 ListView 直到建立“选中”复选框。然后删除项目,再一次(存在重复)调用 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;
                }
        
            }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-04
          • 1970-01-01
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多