即使长按也可以执行Onclick事件

时间:2013-02-27 13:22:19

标签: android listview

我正在使用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提供。

2 个答案:

答案 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等等。但这种方法就像一个魅力。我刚刚在一个应用程序中实现了弹出菜单。 我希望弹出两个不同的菜单,具体取决于用户是单按还是长按锚点。因此,如果他们快速按下它会弹出一个(打开)菜单,如果长按,它会弹出一个菜单(共享,编辑,删除)等。