【问题标题】:Trouble with Android ListView selection changes when switching ChoiceMode切换 ChoiceMode 时 Android ListView 选择更改的问题
【发布时间】:2012-11-07 01:32:11
【问题描述】:

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

【问题讨论】:

  • “它不起作用”是什么意思?我能想到的故障模式有好几种……还可以多选吗?选中的复选框仍然显示,但您只能选择一个?选中的复选框仍然显示,您可以选择多个?
  • 抱歉 Barak,我已将问题编辑得更具体。

标签: android listview selection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我认为,如果您在将选择模式设置回无(然后调用您的方法清除检查)之前尝试使用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); 
    } 
    

    【讨论】:

    • 谢谢,最近我专注于应用程序更重要的部分,所以我没有对那部分代码进行任何更改。如果我没记错的话,我已经尝试完全按照您的建议进行操作,但没有成功。无论如何,我会看看并尽快让你知道。
    • 抱歉,拖了好久才回复!正如我所想,它没有奏效。但是我尝试了一些新的东西,并通过这样做注意到了一些让我相信这更多的是刷新视图或链接到列表的适配器的问题。如果我选择项目,然后返回 CHOICE_MODE_NONE,然后转到“编辑活动”(点击列表中的任何项目),然后返回“列表活动”,列表的选择不再可见。只是预感,但我会尽快尝试。
    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多