我正在使用ExpandableListView lv
。这就是我所拥有的。
ExpandableListView lv=(ExpandableListView )findViewById(....);
lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener(){
@Override
public boolean onChildClick(ExpandableListView parent, View v,int gp, int cp, long id) {
Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
//perform action
return true;
}
});
lv.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View v,ContextMenuInfo menuInfo) {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuInfo;
customMenu.show(v);
//do other stuff
contextMenu=null;
}
});
当我长按一个子项目时,会调用customMenu.show(v)
,当我抬起手指时,会调用OnClickListener
。
类似地,在长按并然后在组项目上释放手指时,将调用其ContextmenuListener
,然后该组将展开以显示子项目。这是正常的行为吗?我该如何防止这种情况?
我实际上想在列表项上对long Click
执行操作。在true
上返回longClickListener
可以正常工作(使用点击事件)。
但我还需要获取项目的ID,组和子位置,这只通过ContextMenuInfo
侦听器中的contextmenu
提供。
答案 0 :(得分:6)
确保
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
return true; //<-- this should be TRUE, not FALSE
}
正在返回true
。返回false
似乎继续调用onClick()
的方法。
这个解决方案至少对我有用。当我在eclipse中自动生成代码时,return false
是我的默认设置,我并没有考虑改变它。
答案 1 :(得分:-1)
设置全局布尔值,例如
boolean isLongClick = false;
public void onClick(View arg0) {
if(isLongClick == false){ // this checks to see if it was long clicked
// Perform your action here
}
isLongClick = false; // resetting longClick to false after bypassing action
}
public boolean onLongClick(View arg0) {
isLongClick = true;
//perform other action here
return false;
}
这样做会运行两个动作侦听器,一个用于单击,一个用于长按。 如果用户长时间点击该对象,则会将布尔值设置为true,从而阻止该操作 在onClickListener中执行,但onClickListener仍然会触发,无论如何,所以 我们确保在该方法中重置布尔值,以便在长按后,该项目将再次接受单次按下。
当然,这默默地暗示你需要获得项目的ID等等。但这种方法就像一个魅力。我刚刚在一个应用程序中实现了弹出菜单。 我希望弹出两个不同的菜单,具体取决于用户是单按还是长按锚点。因此,如果他们快速按下它会弹出一个(打开)菜单,如果长按,它会弹出一个菜单(共享,编辑,删除)等。