我的情景:
- 我在多选模式下使用列表视图来启用用户
立即删除他/她已检查过的几件物品
- 当用户单击删除按钮时,我执行以下操作:
使用以下命令检查项目的 -get位置:myList.getCheckedItemPositions();
- 获取此位置的项目并将它们放入列表 - toDeleteList
- (基于此步骤的问题)使用myList.setItemChecked(position,
false)取消选中列表项
- 删除“toDeleteList”
现在,我被“强制”手动取消选中列表项,因为myList.getCheckedItemPositions()的结果在从mylist中删除后没有改变..即
-if,例如,我删除列表[a,b,c,d], b 的第1项(a) 将在删除后显示检查即。列表中的列表[b,c,d] - 删除后。
问题是为什么?因为SparseBooleanArray返回了 myList.getCheckedItemPositions();在之后是 从列表中删除 - 使用适配器。
从列表中删除项目后,我想(我可能错了) 通过适配器,CheckedItemPositions数组也应更改为 反映列表的新状态
例如。
- mylist = [a,b,c,d]
- 然后检查位置0和3检查的项目(a& d)
- 现在检查项目位置(mylist.getCheckedItemPositions())数组
位置0和3的值为true
- 如果我删除&因此,列表中的d,mylist = [b,c],
mylist.getCheckedItemPositions()仍然与上面相同即。从列表中删除项目后仍然检查位置0和3(我认为这不正常 - 但我再次错了)
- 我期待不检查0和0的位置3因为
以前在这些位置的项目不再在列表中。
我在这里弄错了(或者说错了
期望 :) ) ?有人请澄清这一点。
提前谢谢,
答案 0 :(得分:2)
我正在努力解决同样的问题,这对我有用。
首先,我设置了一个游标适配器,根据其ID保持项目检查状态,因为当列表可以动态更改时,位置无用。
private class TagListAdapter extends SimpleCursorAdapter {
/**
* Stores boolean values for the list items, based on their ids.
*/
SparseBooleanArray mCheckStates;
public TagListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
mCheckStates = new SparseBooleanArray();
}
/**
* Sets an id as checked/unchecked.
* @param id
* @param checked
*/
public void setChecked(int id, boolean checked) {
mCheckStates.put(id, checked);
}
/**
* @see android.widget.ListAdapter#getView(int, View, ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if(!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
int id = mCursor.getInt(INDEX_OF_COLUMN_ID);
if(mCheckStates.indexOfKey(id) < 0) {
// Populate checked value for the first time.
mCheckStates.put(id, function_that_returns_if_the_item_is_checked(id));
}
// Set the item as checked or unchecked based on the value stored in mCheckStates.
mListView.setItemChecked(position, mCheckStates.get(id, false));
return view;
}
}
然后在我的活动中,我设置了一个onListItemClick(),它执行相关的check / uncheck操作并在适配器中设置检查状态:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
boolean checked = ((CheckedTextView) v).isChecked();
if(checked == true) {
// execute uncheck related action
function_called_when_item_is_unchecked(id);
} else {
// execute check related action
function_called_when_item_is_checked(id);
}
// Check/uncheck the item in the adapter.
((TagListAdapter) getListAdapter()).setChecked((int) id, !checked);
}
答案 1 :(得分:1)
说出我的个人意见,我假设这些职位仍然会被检查,因为getCheckedItemPositions()
反映了与价值相对的立场,所以如果删除后ListView
内的职位0和3仍然存在,他们将继续检查。
我可能是错的,只是表达我自己的意见。祝你好运
答案 2 :(得分:0)