2012-01-05 57 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