2013-02-27 37 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

相關問題