我有一个使用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();
}
答案 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) );
}
这可能会更有效率,因为它只有一次传递