我有一个愚蠢的小问题。我已将ListFragment
注册为自己的OnItemClickListener
OnItemLongClickListener
和ListView
。
当调用onItemClick
事件时,会启动该项目的详细视图活动的意图,没有问题。
当onItemLongClick
事件发生时,我想完成以下事情:
代码:
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if(this.cabMode != null)
return false;
this.cabMode = getActivity().startActionMode(editModeCallback);
view.setSelected(true);
return true;
}
然而,CAB会显示选择不会留在该项目中。
有些点点滴滴,如果它们相关:我已经阅读了关于通过调用view.requestFocusFromTouch()
或使用listView.setItemChecked()
来修复此问题,但这对我不起作用。此外,列表项的视图是从自定义布局实例化的,但不附加任何自定义事件侦听器。
感谢任何帮助。 THX!
答案 0 :(得分:8)
这是可能的,但只是勉强......我实际上不知道这么简单的事情怎么会如此荒谬复杂。
答案的关键点可以在这里找到: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处于活动状态时,您不会意外触发通常与项目相关的操作(例如打开详细视图)。
答案 1 :(得分:1)
我的解决方案:(技巧)
final ListView lvMain = (ListView) activity.findViewById(R.id.listTHEMES);
lvMain.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lvMain.setItemsCanFocus(false);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
android.R.layout.simple_list_item_multiple_choice, ArrayTheme);
lvMain.setAdapter(adapter);
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int pos, long id) {
// TODO Auto-generated method stub
if (lvMain.isItemChecked(pos)){lvMain.setItemChecked(pos,false);}else{lvMain.setItemChecked(pos,true);}
Log.v(LOG_TAG,"long clicked pos: " + pos);
//lvMain.setSelection();
return true;
}
});
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id);
if (lvMain.isItemChecked(position)){lvMain.setItemChecked(position,false);}else{lvMain.setItemChecked(position,true);}
}
});