2012-01-05 58 views
2

我在Android中有一個ListView,我想有行視圖和父ListView本身的onTouchListeners。我想要單獨響應單擊和長按,但要在整個ListView上掠過。 (我可以單獨爲每個行設置onFling方法,但它不是健壯的,因爲用戶可以在行之間移動他的手指。)我能夠成功地爲行和ListView分別設置onTouchListener,但是當我同時設置,ListView偵聽器從不觸發 - 只有行偵聽器。無論我在行監聽器的方法中是否返回true或false,都是這種情況。是否有人知道如何觸發onTouchListeners的視圖和它的父母,因爲他們佔用屏幕上的相同像素?單獨的onTouchListeners視圖和它的父

爲ListView相關的代碼:

在活動onCreate方法:

mListViewDetector = new GestureDetector(new ListViewGestureListener()); 
mListViewListener = new View.OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     return mListViewDetector.onTouchEvent(event); 
    } 
}; 

mListView = getListView(); 
mListView.setOnTouchListener(mListViewListener); 

而定製GestureListener類(在活動定義爲嵌套類):

class ListViewGestureListener extends SimpleOnGestureListener { 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     Log.i("ListViewGestureDetector","onFling"); 
     return false; 
    } 

} 

列表視圖中各行的相關代碼:

在適配器類的bindView方法:

TextView textView; 
textView.setOnTouchListener(new ListsTextViewOnTouchListener()); 

而定製onTouchListener類(在適配器類定義爲嵌套類):

class ItemsTextViewOnTouchListener implements OnTouchListener { 

    public boolean onTouch (View v, MotionEvent event){ 
     switch(event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
      //stuff 
      return false; 
     case MotionEvent.ACTION_CANCEL: 
      //stuff 
      return false; 
     default: 
      break; 
     } 
     return false; 
    } 

} 
+0

絕對的,但讓我問你:你丟滾動或扔左/右? – 2012-01-05 13:24:17

+0

從左到右。我正在使用它來切換活動。 – pvans 2012-01-06 04:27:44

回答

1

Pvans,

答案是一個小技巧,但這種能力是內置的。onTouchEvent()處理TouchEvent爲它是一個監聽器的任何對象。然後有兩種選擇來完成你想要的。

1)你可以覆蓋父視圖上的onInterceptTouchEvent()並在那裏處理你的扔。我發現這適用於較小視圖的大視圖。我不喜歡這種方法列表(坦率地說)。 onInterceptTouchEvent()在將Touch從兒童身上移開時非常棒,但是如果你這樣做了,你將不得不處理左右晃動和水平滾動。

2)你也可以創建一個GestureDetector,它實際上是一個不可見的疊加層(排序)。如果您將onTouchEvents轉發給它,您仍然會得到所需的行爲,並且不必擔心手動處理滾動。在這種情況下,您只需將TouchEvent發送給檢測器,並且如果它返回true,則您的List將不執行任何操作,並且您的OnFling將執行此操作。如果返回false,則不處理,因此它必須屬於List或其子項之一。

希望這有助於 FuzzicalLogic

+0

我正在使用您所做的GestureDetector建議,但無論從ListView偵聽器還是行偵聽器返回true或false,我都遇到同樣的問題。 – pvans 2012-01-17 05:50:21

+0

我附上了我的代碼的相關部分。當我如圖所示運行它時,當我扔掉其中一行時,ListViewGestureListener中的Log命令從不執行。但是,如果我只是將'textView.setOnTouchListener'命令註釋掉(以便這些行不再擁有自己的偵聽器,那麼將執行該Log命令。你的建議很有意義 - 必須有一些簡單的東西,我錯過了。 – pvans 2012-01-17 05:50:37

+0

我沒有在onInterceptTouch()上看到,所以是的,你確實錯過了一些東西。如果我將一些代碼拉出來給你一個例子,那可能是最好的。我記得這件事和我一起搞了大約一個星期,直到我自己拿到了。你能等到明天晚上,我可以爲你清理一個嗎? – 2012-01-17 09:00:24