You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用嵌套RecyclerView的父子项点击/触摸事件但保留滚动功能

解决RecyclerView禁用触摸后滚动失效的问题

你当前的代码中,onInterceptTouchEvent直接返回true,会拦截所有触摸事件,导致RecyclerView自身无法处理滚动相关的事件(比如滑动手势),因此滚动功能失效。以下是几种针对性的解决方案:

方案1:直接禁用子项的点击/触摸(推荐)

如果你的需求只是禁用RecyclerView子项的点击、触摸响应,但保留滚动功能,不需要用OnItemTouchListener,直接在Adapter的onBindViewHolder中给子项设置不可点击、不可聚焦即可:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // 你的数据绑定逻辑
    holder.itemView.setClickable(false);
    holder.itemView.setFocusable(false);
    // 如果需要禁用长按,再加这句
    holder.itemView.setLongClickable(false);
}

方案2:通过OnItemTouchListener区分事件类型

如果必须使用OnItemTouchListener,需要在onInterceptTouchEvent中判断事件类型,只拦截你需要禁用的交互(比如点击),让滚动相关的事件(如滑动)正常传递给RecyclerView:

recyclerview.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        // 仅拦截点击类事件(按下、抬起),允许滚动事件(滑动)传递
        int action = e.getAction();
        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
            return true;
        }
        // 滚动相关的事件不拦截,交给RecyclerView处理
        return false;
    }

    @Override
    public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        // 空实现,因为已拦截不需要的事件
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
});

方案3:通过OnTouchListener判断滚动意图

如果需要更精细地控制,比如允许纵向滚动但禁用横向滑动和点击,可以通过setOnTouchListener实现:

recyclerview.setOnTouchListener(new View.OnTouchListener() {
    private float startX, startY;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = event.getX();
                startY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                float dx = Math.abs(event.getX() - startX);
                float dy = Math.abs(event.getY() - startY);
                // 纵向滑动(滚动),交给RecyclerView处理
                if (dy > dx) {
                    return false;
                }
                // 横向滑动或点击操作,拦截
                return true;
        }
        // 默认拦截非滚动事件
        return true;
    }
});

内容的提问来源于stack exchange,提问作者IGN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:18:33