切换ChoiceMode时,Android ListView选择的问题会发生变化

时间:2012-07-08 10:49:50

标签: android listview selection

我在尝试清除ListView中项目的选择(选择)时遇到了奇怪的行为。代码工作得很好,其功能允许(一次在CHOICE_MODE_MULTIPLE中)通过点击选择单个项目,选择全部,选择无并反转当前选择。由于ListView应该在两种模式下工作(_NONE和_MULTIPLE),我有这个菜单项可以在这些模式之间切换,允许用户“打开”一个项目或一次选择几个项目进行批处理操作。

我所面临的问题仅在将选择模式从CHOICE_MODE_MULTIPLE更改回CHOICE_MODE_NONE时显示。我要做的是不仅要恢复到CHOICE_MODE_NONE,还要清除任何选择。奇怪的是,虽然所有函数都可靠地工作,但是当我在更改回CHOICE_MODE_NONE之前调用“select non”函数时,无论我在何处或何时调用代码中的“select none”函数,所有项都会保持检查状态。< / p>

处理选择更改的函数如下:

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可以很好地完成。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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); 
}