使用迭代器从列表视图中删除多个选中的项

时间:2013-11-26 23:27:14

标签: android listview iterator

我有一个使用CHOICE_MODE_MULTIPLE的ListView 一旦用户做出选择,我需要从列表中删除所选项目。

我使用getCheckedItemPositions()返回已检查项的SparseBooleanArray。

我读过的所有文档和相关问题表明,为了有效地从列表中删除项目,您应该使用 Iterator ,但我无法弄清楚如何执行此操作。

我通过索引循环ListView中的项目并使用项目列表的临时克隆来查找应删除的项目(参见下面的代码),从而实现了相同的操作。但是应该循环遍历这样的索引来从List = Bad Coding Monkey 中删除项目。我被告知我应该用Iterator来做。但是如何?

protected void removeItems() {
    SparseBooleanArray itemsSelectionState = mItemsListView.getCheckedItemPositions();
    ArrayList<String> itemsClone = (ArrayList<String>) mItems.clone();
    for (int i = 0; i < mItemsListView.getCount(); i++) {
        if (itemsSelectionState.get(i) == true) {
            mItems.remove(itemsClone.get(i));
        }
    }
    mItemsListView.clearChoices();
    mItemsListAdapter.notifyDataSetChanged();
}

1 个答案:

答案 0 :(得分:2)

无论如何,您需要该位置来查找稀疏数组中的布尔值。如果你必须维护一个索引值以确定是否应该删除该项,那么使用迭代器没有多大意义。

是的,我认为你的方法是有效的。迭代器确实有一个remove()方法,但你仍然需要一个方便的索引。如果id是稳定的(使用基于ArrayList的适配器,id通常等于位置)那么使用getItemIds()并使用id作为位置迭代该列表可能更有效。

// could also store ids[] and pre-allocate mItemsClone to ids.length
for (long id : ..getItemIds() ){ 
  itemsClone.put( mItems.get( (int) id) );
} 

这可能会更有效率,因为它只有一次传递