当我从Android中的ListView中删除多个项目时,如何更新SparseBooleanArray键值

时间:2016-06-16 09:05:09

标签: android listview

我有一个带有ArrayAdapter的ListView。

我选择多个项目,然后尝试从Database和ListView中删除它们。

我已将删除置于动作模式上下文菜单中,我删除如下:

if(item.getItemId() == R.id.action_delete)
     {
     SparseBooleanArray selected = adapter.getSelectedIds();
     short size = (short)selected.size();

     for (byte I = 0; I<size; I++)
         {
         if (selected.valueAt(I))
            {
            Contact selectedItem = adapter.getItem(selected.keyAt(I));
            boolean number = mHelper.deleteCont(myList.get(selected.keyAt(I)).getId());
            adapter.remove(selectedItem);
            adapter.notifyDataSetChanged();

            }
          }

           // Close CAB (Contextual Action Bar)
           mode.finish();
}

但是如果我选择了3个listview元素来删除它们之间有一个位置差异,则 SparseBooleanArray的键(元素的位置) DOES NOT对应于有效元素。

我如何将SparseBooleanArray的键放入来自数据库的唯一ID?

适配器中的SparseBooleanArray如下:

public void toggleSelection(int position) {
    selectView(position, !mSelectedItemsIds.get(position));
}

public void selectView(int position, boolean value) {
    if (value)
        mSelectedItemsIds.put(position, value);
    else
        mSelectedItemsIds.delete(position);
    notifyDataSetChanged();
}

public SparseBooleanArray getSelectedIds() {
    return mSelectedItemsIds;
}

1 个答案:

答案 0 :(得分:2)

SPARSE 布尔数组,与常规布尔数组(boolean[]不同)是指在整数索引不一定统一时使用,例如在数字ID的情况下。

您应该为SparseBooleanArray中的每个项目使用数字ID,而不仅仅是项目的索引。这可以通过简单地删除从SparseBooleanArray中删除的ID而不用担心索引来解决您的问题。

确保每个元素都有唯一的整数ID,然后在将其添加到SparseBooleanArray时使用它。