如何同时处理 OnTouchListener 事件和 OnClickListener 事件

Scr*_*peW 5 android listener kotlin android-recyclerview

我已经RecyclerView设置了每个项目OnTouchListener并且OnClickListener

OnTouch监听器:

override fun onBindViewHolder(holder: ItemListViewHolder, position: Int) {
    val item = getItem(position)
    holder.bind(item)
    holder.itemView.cardview.setOnTouchListener { v, event ->
        if (event.action == MotionEvent.ACTION_DOWN) {
            Log.d(TAG, "onBindViewHolder: $event.buttonState")
            this.startDragListener.onStartDrag(holder)
        }
        return@setOnTouchListener true
    }
}
Run Code Online (Sandbox Code Playgroud)

OnClickListener:(在视图持有者内部)

 init {
    itemView.setOnClickListener(this)
}

 override fun onClick(v: View?) {
        onItemClickListener.onItemClick(adapterPosition)
    }
Run Code Online (Sandbox Code Playgroud)

问题是当我单击该项目时,仅startDragListener触发,但单击事件从未触发。

我在 stackoverflow 上读到了一些关于这个问题的类似问题,但其中大多数都是非常旧/已弃用的方法

如何解决这个问题并处理触摸监听器和点击监听器?

小智 4

请注意,onClickListener 不能与 onTouchListener 一起使用。您必须在 onTouchListener 中实现一些逻辑来区分单击和拖动。我做了类似的事情,代码是用java编写的,但你可以得到一个想法。

switch (motionEvent.getAction()) {
        case MotionEvent.ACTION_DOWN:
            x = motionEvent.getX();
            y = motionEvent.getY();
            return true;

        case MotionEvent.ACTION_UP:
            // PUT ON CLICK LOGIC HERE
            break;
        case MotionEvent.ACTION_MOVE:
            if ((motionEvent.getX() - x) > 80 || (x - motionEvent.getX()) > 80
                    || (motionEvent.getY() - y) > 50 || (y - motionEvent.getY()) > 60) {
                    view.startDrag(data, new View.DragShadowBuilder(view) {
                        @Override
                        public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
                            shadowSize.set(view.getWidth(), view.getHeight());
                            shadowTouchPoint.set((int) motionEvent.getX(), (int) motionEvent.getY());
                        }
                    }, view, 0);
            }
            return true;

    }
Run Code Online (Sandbox Code Playgroud)