2

我在 Android 中有一个 ListView,我想为行视图和父 ListView 本身设置 onTouchListeners。我想单独响应对行的单击和长按,但要对整个 ListView 进行响应。(我可以为每一行单独设置 onFling 方法,但它并不可靠,因为用户可以跨行移动手指。)我能够成功地分别为行和 ListView 设置 onTouchListener,但是当我设置两者,ListView 侦听器永远不会触发 - 只有行侦听器。无论我在行侦听器的方法中返回 true 还是 false,都是这种情况。鉴于它们在屏幕上占据相同的像素,有人知道如何为视图及其父级触发 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;
    }

}

Listview中各个行的相关代码:

在适配器类的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;
    }

}
4

1 回答 1

1

普瓦斯,

答案有点棘手,但该功能是内置的。onTouchEvent()为它作为侦听器的任何对象处理 TouchEvent。然后有两个选项可以完成您想要的。

1)您可以覆盖onInterceptTouchEvent()父视图并在那里处理您的投掷。我发现这对于具有较小子视图的大型视图非常有用。我不喜欢列表的这种方法(坦率地说)。onInterceptTouchEvent()将触摸从孩子身上拿走是很棒的,但如果你这样做,你将不得不处理左右甩动和水平滚动。

2)你也可以创建一个GestureDetector实际上是一个不可见的覆盖(有点)。如果您将 onTouchEvents 转发给它,您仍然会获得所需的行为,并且您不必担心手动处理滚动。在这种情况下,您只需将 TouchEvent 发送到 Detector,如果它返回 true,您的 List 什么也不做,而您的 OnFling 会完成工作。如果它返回 false,则它没有被处理,因此它必须属于 List 或其子之一。

希望这会有所帮助, FuzzicalLogic

于 2012-01-06T08:17:45.260 回答