我在尝试清除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不会取消选中它们,仅当我在上述代码部分中调用函数时才取消选中它们。在不尝试更改选择模式的情况下调用全选就可以了。

最佳答案

我遇到同样的问题。似乎已经有related question的答案指出这是Android中的错误。

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

10-04 23:01
查看更多