我在尝试清除 ListView 中项目的选择(选择)时遇到了一个奇怪的行为。该代码运行良好,其功能允许(在 CHOICE_MODE_MULTIPLE 中一次)通过点击、全选、全选和反转当前选择来选择单个项目。由于 ListView 应该在两种模式(_NONE 和 _MULTIPLE)下工作,我有这个菜单项可以在这些模式之间切换,允许用户“打开”一个项目或一次选择多个项目进行批处理操作。
我面临的问题仅在将选择模式从 CHOICE_MODE_MULTIPLE 更改回 CHOICE_MODE_NONE 时出现。我要做的不仅是恢复到 CHOICE_MODE_NONE,而且还要清除任何选择。奇怪的是,虽然所有函数都可靠地工作,但当我在更改回 CHOICE_MODE_NONE 之前调用“select non”函数时,所有项目都保持选中状态,无论我在代码中何时何地调用“select none”函数。
处理选择更改的函数如下:
private void changeItemSelection(int selection) {
NotesAdapter adapter = (NotesAdapter)listView.getAdapter();
if (selection == SELECT_ALL) {
for(int iCount = 0; iCount < adapter.getCount(); iCount++) {
listView.setItemChecked(iCount, true);
}
}
else if (selection == SELECT_NONE) {
for(int iCount = 0; iCount < adapter.getCount(); iCount++) {
listView.setItemChecked(iCount, false);
}
}
else if (selection == SELECT_INVERT) {
for(int iCount = 0; iCount < adapter.getCount(); iCount++) {
listView.setItemChecked(iCount, !listView.isItemChecked(iCount));
}
}
adapter.notifyDataSetChanged();
checkedItemCountInvalid = true; // Invalidate checked indices cache
}
这是当用户点击切换选择模式的菜单项时发生的情况:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_multisel:
toggleSelectionMode();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void toggleSelectionMode() {
if (listView.getChoiceMode() == ListView.CHOICE_MODE_NONE) {
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
else {
listView.setChoiceMode(ListView.CHOICE_MODE_NONE);
}
changeItemSelection(SELECT_NONE);
}
无论我将“changeItemSelection(SELECT_NONE)”放在上面的代码块中的哪个位置,它都无法正常工作。但是当我删除“listView.setChoiceMode(ListView.CHOICE_MODE_NONE)”时,它神奇地开始按预期工作。这让我发疯了......我真的很感激对此的任何见解。
谢谢阅读!
编辑:我所说的“不工作”是指选择保持不变。因此,如果 item1 和 item3 被选中,调用 select none 不会取消选中它们,但只有当我在上面提到的代码部分调用函数时。在不尝试更改选择模式的情况下调用 select none 效果很好。