我有一个带有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;
}
答案 0 :(得分:2)
SPARSE 布尔数组,与常规布尔数组(boolean[]
不同)是指在整数索引不一定统一时使用,例如在数字ID的情况下。
您应该为SparseBooleanArray
中的每个项目使用数字ID,而不仅仅是项目的索引。这可以通过简单地删除从SparseBooleanArray
中删除的ID而不用担心索引来解决您的问题。
确保每个元素都有唯一的整数ID,然后在将其添加到SparseBooleanArray
时使用它。