我们的 UX 要求一个按钮来启动多选模式。这将与长按一个项目做同样的事情,但最初不会选择任何内容。
我在代码中看到的是,除非我选择了某些东西,否则我无法进入多选模式模式,如果我取消选择该项目,多选模式就会退出(上下文操作栏关闭)。
我也在其他应用程序(gmail)中尝试过这个,它的工作方式相同。
有没有办法在多选模式下不选择任何项目?
我们的 UX 要求一个按钮来启动多选模式。这将与长按一个项目做同样的事情,但最初不会选择任何内容。
我在代码中看到的是,除非我选择了某些东西,否则我无法进入多选模式模式,如果我取消选择该项目,多选模式就会退出(上下文操作栏关闭)。
我也在其他应用程序(gmail)中尝试过这个,它的工作方式相同。
有没有办法在多选模式下不选择任何项目?
这很 hacky,但我通过选择一个项目来做到这一点,但通过使背景暂时透明,使它看起来没有被选中。当用户随后选择项目时,取消选择秘密选择的项目并且背景恢复正常。或者,如果它是被秘密选择的项目(因此取消选择它),我重新选择它,然后设置一个布尔值以阻止它再次发生。
我还必须在 onItemCheckedStateChanged 中使用计数器,因为我正在从该回调中更改秘密项目的检查状态,从而导致循环。
可能不是所有情况下的理想解决方案,但我认为目前没有其他方法可以做到这一点,因为AbsListView 不容易扩展。
编辑:如果屏幕方向发生变化,而选中项的选中状态是隐藏的,它会突然显示为选中,所以你必须确保保存它应该隐藏的事实,并在列表视图被恢复后恢复它重新创建。我必须使用 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(新的 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; } });