【问题标题】:Remove multiple checked items from list view using iterator使用迭代器从列表视图中删除多个选中项
【发布时间】:2013-11-26 23:27:14
【问题描述】:

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

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

我阅读的所有文档和相关问题都表明,要有效地从列表中删除项目,您应该使用 Iterator,但我不知道该怎么做。 p>

我通过按索引循环遍历 ListView 中的项目并使用项目列表的临时克隆来查找应删除的项目来实现相同的操作(请参见下面的代码)。但据说循环遍历这样的索引以从 List = Bad Coding Monkey 中删除项目。我被告知我应该使用迭代器来代替。但是怎么做呢?

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

【问题讨论】:

    标签: android listview iterator


    【解决方案1】:

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

    是的,我认为您的方法是有效的。迭代器确实有一个 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) );
    } 
    

    这可能会更有效率,因为它只是一次通过

    【讨论】:

    • 感谢您的回复。只是检查......你是说我的方法对这种情况有效,所以不要担心?
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 2012-02-12
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多