1

如何使用删除的上下文操作删除多项选择列表视图中的选中项目 -

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

        }
    };

适配器=新的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) 方法中实现它,以便在“名称”ArrayList 中删除 ListView 中选定的项目 ID。请给一些提示

我知道我可以更新适配器列表

adapter.notifyDataSetChanged();

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

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

谢谢

4

2 回答 2

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 调用它并将这些位置存储在某处即可。然后您可以删除这些位置的所有项目。

于 2013-02-09T20:40:07.217 回答
1

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

removeItems = lv.getCheckedItemIds(); 

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

所以我试图检索检查项目的位置

SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();

然后删除它们并更新数组列表和适配器

    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 每次删除一个元素时都会动态更改其元素索引,因此最终结果会出错。

这是此类问题的讨论链接,但没有解决方案- 如何从多选列表视图中获取所选项目

我是如何解决这个问题的:

  1. 创建了第二个 ArrayList 实例
  2. 用 UNCHECKED 项更新了 ArrayList 实例
  3. 将它添加到我的列表适配器 - 这是方法

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

希望它会有所帮助:)

于 2013-02-10T11:32:58.850 回答