android中RecyclerView嵌套问题中,内层RecyclerView区域无法响应Item点击事件

问题描述:

项目需求中要使用到RecyclerView内嵌套RecyclerView布局,但问题是,我点击外层RecyclerView,内层RecyclerView的区域无法响应外层的点击事件。
在这里插入图片描述

解决方法(方法不同,原理相同)

注意:以下方法只是针对于内层RecyclerView没有设置任何点击事件的,有点击事件的暂时还没想到如何去设置,如果有知道的大佬可以在评论区告诉我,谢谢

1.方法一

给内层的RecyclerView设置OnTouchListener,在onTouch中处理外层RecyclerView的Item的触摸事件 onTouchEvent。item已经设置了点击事件,所以在onTouchEvent的事件处理中会调用到item的点击事件。

            good_list_rv.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return itemView.onTouchEvent(event);
                }
            });
2.方法二

依然是给内层的RecyclerView设置OnTouchListener,在onTouch中调用外层RecyclerView的Item的 preformClick方法 ,执行外层item的点击事件。

         good_list_rv.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_UP){
                        itemView.performClick();
                    }
                    return false;
                }
            });
3.方法三

这个方法,其实就是在方法二的基础上加了些判断,然后进行封装,代码如下:

/**
 * 用于处理 RecyclerView嵌套RecyclerView,内层RecyclerView区域无法响应Item点击问题(内层recyclerview使用)
 */
public class ChildTouchListener implements View.OnTouchListener {
    private float downX;
    private float downY;
    private float touchSlop;
    private View view;

    public ChildTouchListener(View view){
        this.view = view;
        touchSlop = ViewConfiguration.get(view.getContext()).getScaledTouchSlop();
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getActionMasked()){
            case MotionEvent.ACTION_DOWN:
                downX = event.getX();
                downY = event.getY();
                break;
                case MotionEvent.ACTION_UP:
                    if(Math.abs(event.getY()-downY) < touchSlop && Math.abs(event.getX()-downX)<touchSlop){
                        view.performClick();
                    }
                    break;
        }
        return false;
    }
}

使用

 good_list_rv.setOnTouchListener(new ChildTouchListener(itemView));
原理总结

上面的方法中,原理都是相同的。
内层的RecyclerView区域点击没响应,是因为RecyclerView内部重写了onTouchEvent方法,导致了上述问题的发生。
然后我们给RecyclerView设置OnTouchListener,那么OnTouchListener中的onTouch方法会在onTouchEvent方法之前回调,并且需要注意onTouch方法的返回值,如果是false,onTouchEvent方法才会被调用,如果是true,那么onTouchEvent方法将不会被调用(也就是给view设置的OnTouchListener的优先级高于onTouchEvent),我们的处理中返回false以便不影响RecyclerView后续onTouchEvent中的固有逻辑。另外onTouchEvent方法中,如果当前View设置的有OnClickListener,那么它的onClick方法会被调用,这也就是方法1中直接调用了itemView的onTouchEvent方法,自然后续会调用到我们设置的OnClickListener中的onClick方法,执行我们想要的业务逻辑。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值