如何删除多选列表视图中的已选项

时间:2013-02-09 20:29:47

标签: android android-listview

如何删除多选列表视图中的已检查项目以及要删除的上下文操作 -

ArrayList<String> liveNames = new ArrayList<String>() {
        {
            add("dani");
            add("john");
            add("dave");
            add("alen");
            add("deno");
            add("feliks");
            add("jupi");

        }
    };

adapter = new ArrayAdapter(这个,             android.R.layout.simple_list_item_multiple_choice,liveNames);

    setListAdapter(adapter);

.......

 @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            lv = getListView();
            // Respond to clicks on the actions in the CAB
            switch (item.getItemId()) {
                case R.id.item1:
                    if(lv.getCheckedItemCount() > 0){
                        removeItems = lv.getCheckedItemIds();
                        deleteSelectedItems(removeItems);
                    }
                    mode.finish(); // Action picked, so close the CAB
                    return true;

                default:
                    return false;
            }
        }

现在我应该如何在deleteSelectedItems(long [] delItms)方法中实现它,以便在“names”ArrayList中删除ListView中的选定项ID。请提供一些提示

我知道我可以用

更新适配器列表
adapter.notifyDataSetChanged();

但是如何使用他们的ID获取列表视图中项目的位置,以便我可以

name.remove(position) - but I have only the IDs.

谢谢

2 个答案:

答案 0 :(得分:3)

这个方法应该为你做的,我想:

/* returns item's position in ArrayList by ID */
public int getItemPositionById(int id)
{
   for(int i = 0; i < names.size(); i++) {
      if(names.get(i).getId() == id) {
         return i;   // if found item with specified id, return it's position
      }
   }
   return -1;        // didn't find item with specified id
}

只需为你拥有的所有ID调用它并将这些位置存储在某处。然后,您可以删除这些位置的所有项目。

答案 1 :(得分:1)

无论如何,我无法使用此方法检索已检查的ID

removeItems = lv.getCheckedItemIds(); 

因为适配器需要有稳定的ID ...或类似的东西

所以我尝试用

检索已检查项目的位置
SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();

然后删除它们并更新arraylist和适配器

    public void removeSelectedItems(){
    int count = lv.getCount();
    SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
    for (int i=0;i<count;i++){
        if(checkedItemPositions.get(i))


        Log.e("TEST", liveNames.get(i));
        liveNames.remove(i);
    }

    adapter.notifyDataSetChanged();
}

问题是我想使用liveNames ArrayList,每次删除一个元素时动态更改其元素索引,以便最终结果出错。

以下是此类问题的讨论链接,但没有解决方案 - How to get Selected items from Multi Select List View

我如何解决问题:

  1. 创建了第二个ArrayList实例
  2. 使用UNCHECKED项目
  3. 更新了该ArrayList实例
  4. 将其添加到我的listadapter中 - 这是方法

    public void removeSelectedItems(){
    
    updatedList = new ArrayList<String>(); //initialize the second ArrayList
    
    int count = lv.getCount();  //number of my ListView items
    SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
    for (int i=0;i < count;i++){
        if(!checkedItemPositions.get(i))
    
        updatedList.add(liveNames.get(i));  
        Log.e("TEST", liveNames.get(i));
    }
    
    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_multiple_choice, updatedList);
    
    setListAdapter(adapter);}
    
  5. 希望它会有所帮助:)