这是可能的,但只是勉强能实现……我实际上不知道为什么如此简单的事情会变得如此复杂。
答案的关键在于这里:
Android: keep blue background after ListView selection
这意味着要定义一个额外的样式,该样式由ListView使用,并将选择模式设置为AbsListView.CHOICE_MODE_SINGLE(如链接答案中所述)。
这允许您通过Listview.setItemChecked()以编程方式切换选择。但是,您需要自己在onItemLongClick回调中跟踪触摸项目的索引,因为ListView.setSelection()不会这样做(至少ListView.getSelectedItem()总是返回-1,据我所见)。
代码(为简单起见,我的片段实现了所有三个OnItemClickListener,OnItemLongClickListener和ActionMode.Callback):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
this.listViewAdapter = new ListViewAdapter();
this.root = (ListView)inflater.inflate(R.layout.fragment_bookmarks, container, false);
this.root.setAdapter(this.listViewAdapter);
this.root.setOnItemClickListener(this);
this.root.setOnItemLongClickListener(this);
this.root.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
return this.root;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if(this.cabMode != null)
return false;
this.selectedPosition = position;
this.root.setItemChecked(position, true);
this.root.setOnItemClickListener(null);
this.cabMode = getActivity().startActionMode(this);
return true;
}
最后,如果您想在关闭CAB时取消选择,请执行以下操作:
@Override
public void onDestroyActionMode(ActionMode mode) {
cabMode = null;
this.root.setItemChecked(this.selectedPosition, false);
this.selectedPosition = -1;
this.root.setOnItemClickListener(this);
}
注册和注销OnItemClickListener
可以确保在CAB处于活动状态时,您不会意外触发通常与该项相关的操作(例如打开详细视图)。
listView.setItemChecked()
需要一个位置参数,但调用它没有效果。 - ChrisListView.setChoiceMode(...)
?如果找不到解决方法,你可以像这里(http://goo.gl/7aQAn)一样手动选择。 - codinguserlistView.setItemChecked()
和view.setSelected()
方法进行调用,但是仍然没有效果。我会看一下Sherlock代码,不过我认为我所尝试的东西非常基础,应该有一种简单的方法来实现它。 - Chris