1

我在尝试清除 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 效果很好。

4

2 回答 2

5

我遇到同样的问题。似乎已经有相关问题的答案表明它是 Android 中的一个错误。

我想这应该是评论,而不是回答。但我只是没有足够的声誉在这里发表评论。

于 2012-11-06T17:32:11.793 回答
1

我不知道你是否已经解决了这个问题,所以这个答案可能为时已晚。

我认为,如果您在将选择模式设置回无(然后调用您的方法以清除检查)之前尝试使用clearChoices(),它将按您的意愿工作。

private void toggleSelectionMode() { 
    if (listView.getChoiceMode() == ListView.CHOICE_MODE_NONE) { 
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    } 
    else { 
        listview.clearChoices();
        listView.setChoiceMode(ListView.CHOICE_MODE_NONE); 
    }        
    changeItemSelection(SELECT_NONE); 
} 
于 2012-08-12T16:09:06.323 回答