解决ViewPager嵌套RecyclerView,RecyclerView嵌套RecyclerView瀑布流事件冲突问题

推荐阅读:

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()_Tiger的专栏-CSDN博客

面试之Android事件传递_Tiger的专栏-CSDN博客

【Android】onInterceptTouchEvent 方法收不到ACTION_MOVE事件_Tiger的专栏-CSDN博客

通过以上阅读可以了解事件传递的机制,及源码事件如何派发

1.瀑布流效果参考

2.嵌套滚动效果实现

 

以上是实现TabLayout+ViewPager,ViewPager嵌套Fragment,Fragment下RecyclerView嵌套RecyclerView瀑布流效果,今天我们主要说一下如何解决ViewPager嵌套RecyclerViewRecyclerView嵌套RecyclerView瀑布流事件冲突问题

2.1外层RecyclerView(OutRecyclerView)

dispatchTouchEvent()处理ViewPager和RecyclerView事件冲突

  • ViewPager嵌套RecyclerView,判断事件是否下发,若RecyclerView滚动顶部,则执行getParent().requestDisallowInterceptTouchEvent(false),ViewPager事件不再继续下发给RecyclerView
  • 否则,getParent().requestDisallowInterceptTouchEvent(true),ViewPager事件下发给RecyclerView;
OutRecyclerView.java    
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //解决recyclerView和viewPager的滑动影响
        if (isGoTop()){
            if (mChangeRefreshListener != null){
                //RecyclerView滚动了顶部,设置可以刷新 true
                mChangeRefreshListener.updateRefreshStatus(true);
            }
            //设置父视图例如ViewPager拦截事件,不继续下发
            getParent().requestDisallowInterceptTouchEvent(false);
        } else {
            //当滑动recyclerView时,告知父控件不要拦截事件,交给子view处理
            getParent().requestDisallowInterceptTouchEvent(true);
        }
        return super.dispatchTouchEvent(ev);
    }

 //判断是否滚动到RecyclerView顶部
    private boolean isGoTop(){
        boolean isScrollTop = false;
        LayoutManager layoutManager = getLayoutManager();
        //瀑布流
        if (layoutManager instanceof StaggeredGridLayoutManager){
            int scrollPos[] = ((StaggeredGridLayoutManager)layoutManager).findFirstVisibleItemPositions(null);
            //判断是否滚到了顶部
            isScrollTop = !canScrollVertically(SCROLLING_UP) ||
                    (getChildAt(0).getY()==0f && scrollPos[0]==0);
            //线性布局
        } else if (layoutManager instanceof LinearLayoutManager){
            int firstItemPosition = ((LinearLayoutManager)layoutManager).findFirstCompletelyVisibleItemPosition();
            //判断是否滚到了顶部
            isScrollTop = !canScrollVertically(SCROLLING_UP) ||
                    (getChildAt(0).getY()==0f && firstItemPosition==0);
        }
        return isScrollTop;
    }

onInterceptTouchEvent()拦截事件处理

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值