2013-02-27 85 views
4

我正在使用ExpandableListViewlv。这就是我所拥有的。 ExpandableListView lv =(ExpandableListView)findViewById(....); lv.setOnChildClickListener(新ExpandableListView.OnChildClickListener(){ @覆盖 公共布尔onChildClick(ExpandableListView父母,视图V,INT GP,INT CP,长ID){即使长时间点击,Onclick事件也会执行

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; 
    } 
    }); 

当我长点击一个clild项目,调用customMenu.show(v),当我松开手指时,调用其OnClickListener 类似地,在长按然后松开组项目上的手指时,会调用其ContextmenuListener,然后该组展开以显示子项目。这是正常行为吗?我如何防止这种情况?

我实际上想在long Click的列表项上做东西。 longClickListener返回true正常工作(消耗点击事件)。 但我还需要获取项目的ID,组和子位置,这是通过ContextMenuInfo在上下文菜单监听器中提供的。

+0

不应该调用lv.registerForContextMenu()来代替吗? – 2013-02-27 13:25:59

+0

好吧,当我试图通过添加一些菜单项来显示contextmenu时,它正常运行。但我不想这样做。我想显示自己的菜单,而不是像给定的代码。 – arnab321 2013-02-27 16:57:09

+0

编辑问题 – arnab321 2013-02-27 17:29:20

回答

-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等按钮,但这种方法工程就像一个魅力。我刚刚在一个应用程序中实现了一个弹出式菜单。 我想要弹出两个不同的菜单,具体取决于用户单击还是长按锚点。因此,如果他们迅速按下它会弹出一个(有开放)菜单中,如果长按它会弹出一个菜单(份额,编辑,删除)等

+2

我希望你找到比这更好的解决方案。 – 2015-02-11 12:51:34

5

确保

@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,但我并不认为要改变它。

+0

这是正确的答案... – 2015-08-10 18:28:37

相关问题