scrollView 嵌套recyclerView 滑动粘合解决

我用半个小时做总结   


昨天下午5店发现这个问题,就在刚刚才解决。 解决办法很简单,而且从昨天到现在 在我眼前飘了不少于10次才被我识别出它的强大


需求描述:

首页是一个很长的内容丰满的页面, 里面有两个卡片,此二卡片有个列表可展开,列表展开后卡片铺满一页,重点是,当卡片展开后,此首页就只有一个卡片无其他了,更别提滚动了。但是不能简简单单将其他内容VIew.Gone掉,因为,展开是动画,是缓慢的动作,是上下慢慢展开,是其他挤出页面的视觉效果,而且卡片收缩的时候,也是慢慢收缩,其他内容慢慢回到页面的过程。


问题:

那么,卡片展开的同时,首页的scrollView不能滚动。


问题解决:

1.第一阶段自然想到的是事件拦截,scrollView事件直接不处理就好了,这很简单

onInterceptTouchEvent 返回 false
onTouchEvent 返回 false.第一阶段自然想到的是事件拦截,scrollView事件直接不处理就好了,这很简单

此时scrollView的滚动是不进行了,被展开的卡片除了RecyclerView 可滚动外,其余就根本不会触发滚动,就真的像是一页只有一个卡片一样,可是RecyclerView滑到边界时候,如果用尽滑动RecyclerView,会带动scrollView滚动。。。。。scrollView滚动不是屏蔽了吗,scrollView 的scrollChange也没有触发呀~~~  

打断点查看RecyclerView的滑动调用 调用之前会先调用父类,查看父类是否滑动 即dispatchNestedPreScroll()返回false,滑动之后调用父类查看是否调用,即:dispatchNestedScroll()也是返回false,这奇怪的问题

2 其实到这部可以确定和NestedScroll滚动有关,

//返回true代表父view消耗滑动速度,子View将不会滑动
@Override
public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
    if (null == mRecyclerView) mRecyclerView = (RecyclerView) target;
    return false;
}

//对应子view 的dispatchNestedPreScroll方法, 最后一个数组代表消耗的滚动量,下标0代表x轴,下标1代表y轴
@Override
public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
    //判断是否滚动到最大值
        if (null == mRecyclerView) mRecyclerView = (RecyclerView) target;
        //计算RecyclerView的偏移量, 等于0的时候说明recyclerView没有滑动,否则应该交给recyclerView自己处理
        if (mRecyclerView.computeVerticalScrollOffset() != 0) return;
        this.smoothScrollBy(dx, dy);
        consumed[1] = dy; //consumed[1]赋值为 dy ,代表父类已经消耗了改滚动。
}

这两个方法看着和父类子类滚动有关,重写之后依然没有任何效果

3 。继续查看发现一片文章 

触摸到RecyclerView的时候滑动还有些粘连的感觉,只需要在代码中设置

mRecyclerView.setNestedScrollingEnabled(false);
对呀,在滑动recyclerView时候,外部滑动,是黏连效应呀,可以试试 果然OK了。。


那么这个方法是什么意思呢 ,查看此参数调用的地方,发现很多地方都是吧isNestedScrollingenable 参数和mNestedScrollingParent同时使用判断,因为父类我们之前已经屏蔽掉了,所以只需查看单纯判断isNestedScrollingenable的地方 只有一个 与startNestedScroll 有关:

startNestedScroll  方法如果返回ture则说明有一个与嵌套滑动合作的父类,但是我们想要的是false,即不让嵌套RecyclerView的滚动影响到ScrollView .所以设置为false就OK了



重要知识点:


 Child 滑动开始的调用 startNestedScroll(),Parent 收到 onStartNestedScroll() 回调,决定是否需要配合 Child 一起进行处理滑动,如果需要配合,还会回调onNestedScrollAccepted()。

参考文章:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0822/3342.html

http://www.jianshu.com/p/791c0a4acc1c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值