【发布时间】:2012-12-07 19:29:12
【问题描述】:
我们的用户体验要求一个按钮来启动多选模式。这与长按某个项目的作用相同,但最初不会选择任何内容。
我在代码中看到的是,除非我选择了某些内容,否则我无法进入多选模式模式,如果我取消选择该项目,多选模式将退出(上下文操作栏关闭)。
我也在其他应用程序 (gmail) 中尝试过这个,它的工作方式相同。
有没有办法在多选模式下不选择任何项目?
【问题讨论】:
我们的用户体验要求一个按钮来启动多选模式。这与长按某个项目的作用相同,但最初不会选择任何内容。
我在代码中看到的是,除非我选择了某些内容,否则我无法进入多选模式模式,如果我取消选择该项目,多选模式将退出(上下文操作栏关闭)。
我也在其他应用程序 (gmail) 中尝试过这个,它的工作方式相同。
有没有办法在多选模式下不选择任何项目?
【问题讨论】:
这很 hacky,但我通过选择一个项目来做到这一点,但通过使背景暂时透明,使它看起来没有被选择。当用户随后选择了一个项目时,该秘密选择的项目被取消选择并且背景恢复正常。或者,如果它是秘密选择的项目被选中(因此取消选择它),我重新选择它,然后设置一个布尔值以阻止它再次发生。
我还必须在 onItemCheckedStateChanged 中使用计数器,因为我正在从回调中更改秘密项目的检查状态,从而导致循环。
可能不是所有情况的理想解决方案,但我认为目前没有其他方法可以做到这一点,因为AbsListView can't easily be extended.
编辑:如果选中项的选中状态隐藏时屏幕方向发生变化,会突然显示为选中状态,所以一定要保存好应该隐藏的事实,之后再恢复重新创建列表视图。我必须使用 View post() 方法来确保在配置更改后列表视图完成重绘其所有子项之后进行恢复。
编辑:另一个潜在的问题是,如果用户在没有选择任何项目的情况下尝试执行操作。据应用程序所知, 选择了一个项目,因此它将对该项目执行操作,除非您确定它没有。
【讨论】:
只需调用:
mListView.setItemChecked(-1, true);
ListView 的 actionMode 将在不选择任何列表元素的情况下启动。
请确保您在调用前正确设置了 ListView:
mListView.setMultiChoiceModeListener( ... )
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
or
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
【讨论】:
你只需要使用:
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
【讨论】:
如果您想更改操作栏,请从您的活动中调用它:
startActionMode(new ActionMode.Callback {
@Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } });
【讨论】: