MotionEvent.ACTION_DOWN 即使我 return 是正确的,也没有被调用

MotionEvent.ACTION_DOWN not being called even though I return true for it

我的 LinearLayoutListView 有一个 onTouchListener,我正在尝试使用 ACTION_DOWNACTION_UP 数据来检测何时用户滑动到下一个 ListView。然而,MotionEvent 永远不会等于 ACTION_DOWN,尽管 ACTION_UP 工作得很好。经过大量谷歌搜索后,我能找到的唯一解决方案是在调用事件时 return true,但我已经在这样做了。这是我的 onTouchListener 代码

View.OnTouchListener mTouchListener = new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                downX = event.getX();
                return true;
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                upX = event.getX();
                if(userSwipedFarEnough)
                    doStuff()
                return true;
            }
            return false;

        }

    };

onTouch 根据触摸类型被调用多次,ACTION_DOWN ACTION_UP ACTION_MOVE 所有这些都可能同时发生。我会说取出 else if 并只使用 if 以便它捕获两个动作

我知道发生了什么,我的列表视图的滚动视图以某种方式窃取了 action_down 所以它没有被调用。当我有一个空列表视图并且滚动有效时,我意识到了这一点。

我的解决方案是扩展 ScrollView:

interface MyScrollViewActionDownListener{
    fun onActionDown()
}

class MyScrollView: ScrollView
{
    private var mActionDownListener: MyScrollViewActionDownListener? = null
    constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int): super(context, attributeSet, defStyleAttr)
    constructor(context: Context):super(context)
    constructor(context: Context, attributeSet: AttributeSet):super(context,attributeSet)

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        if(ev!!.action == MotionEvent.ACTION_DOWN){
            mActionDownListener?.onActionDown()
        }
        return super.onInterceptTouchEvent(ev)
    }

    fun setActionDownListener(listener: MyScrollViewActionDownListener){
        this.mActionDownListener = listener
    }
}