ScrollView嵌套ViewPager+RecyclerView 动态获取ViewPager的高度问题

最新因为有一个项目需求是滑动悬浮效果,很多电商都可能用到的场景,话不多说,直接上图:

其实这个很容易做:最近老加班,脑子有点转不过来了。

布局比较复杂,刚开始想的是用自定义ScrollView嵌套TabLayout+ ViewPager + RecyclerView做,ViewPager是用自包裹做的,但是做出来后发现滑多了以后再切换ViewPager发现很卡顿,我认为是RecyclerView里面的元素没有被复用导致的。因为ViewPager是自包裹的嘛,而且还发现一个问题就是切换后面的tab的时候ViewPager的高度算的不对,下面是计算ViewPager的高度的方法:

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            maps.put(i, h);
            if (getChildCount() > 0 ) {
                height = getChildAt(position).getMeasuredHeight();
                heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

但是发现ChildCount数量最多到8,这个跟你的fragment数量有一定关系,但不是fragment的数量,后来一查,是说ChildCount指的是ViewPager的缓存数量,并不等于ViewPager的itemCount,网上的demo的tab刚好都小于8,超过8后切换到后面的tab项的时候ViewPager的高度都算的不对。

于是想着使用外部拦截法,把ViewPager的高度固定,通过滑动到临界值的方式去交换滑动事件。想法是好的,但是把滑动事件交给了外部的ScrollView去控制,这里又挖坑了,遇到了一个棘手的问题,慢滑到临界值的时候,事件交换不过来,导致有时候会滑不动, 必须快速的滑过去,很影响用户体验啊0.0...

于是又弃坑了,换了个思路:内部拦截的方式,于是又在埋坑的路上继续前行了... 后来发现RecyclerView的item显示有问题,外面根本滑不动,滑动事件没有传递到ScrollView,应该是被ViewPager消费了,后来尝试修改ViewPager的拦截,发现没什么用,有哪位大神做出来的可以指点一二。

后来想了想觉得不用ScrollView了,为什么一定要用ScrollView呢,脑子糊涂了~,用CoordinateLayout + AppBarLayout + ViewPager + RecyclerView其实就可以了。而且这个联动还是挺简单的,不需要自定义behavior。

下面附上布局:




    

        

            

                

                    

                    

                    

                

                

                    

                        

                            

                            

                            

                            

                        

                        

                    

                    

                
                
                

                    

                        

                        

                            

                            

                            

                        
                    

                    

                        

                        

                            

                            

                            

                        

                    

                

            

            

            
            

        

        

    

    
    

        
        

            

            

        

        
        

            

            

        

    

不明白CoordinateLayout用法的,可以看看这篇博文:https://blog.csdn.net/kilotwo/article/details/79197498,

如果需要做更复杂的联动,可以考虑自定义behavior。

所以,前面一顿操作猛如虎,没什么卵用,不过踩了一些坑也,涨见识了,哈哈~

Ps:万一产品提一个很变态的需求,你又没什么想法的时候,可以研究一下竞品是怎么做的。打开竞品的app的当前页,

运行 adb shell dumpsys activity top,你就能看到他们写的布局了,可以做参考,给自己提供一下思路。

你可能感兴趣的:(Android,AppbarLayout,ViewPager,Fragment)