CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+ViewPager中空白过大的问题

出现的问题:ViewPager中包含两个Fragment,这两个Fragment的内容是一样的。如果Fragment中没有内容的话,滑上去下面会有一大片空白。如下图1表示未滑动时的效果图,图2表示滑动以后的效果图,图2中下面一片空白,不。


EasyBook1.jpg
EasyBook2.png

现在需求是滑动时,下面没有数据,就不再滑动从而导致显示整屏空白。

分析:下面没数据时,滑动AppBarLayout,不需要滑动完整个AppBarLayout。那么这个AppBarLayout滑动多少距离合适呢,可滑动距离就是AppBarLayout的高度 + 悬浮布局高度 + recyclerView的高度 - CoordinatorLayout布局的高度,这样保证剩下的正好是个全屏。先看下修改前和修改后的效果图。

IMG_2nxz4n2.gif
IMG_hgynaq1.gif

以下是代码,带部分注释,有不懂的可以问

public class AppBarBehavior extends AppBarLayout.Behavior {

    private ViewPager viewPager;
    private RadioGroup radioGroup;

    private int maxScrollH = 0;
    private int recyclerViewH = 0;

    public AppBarBehavior() {
        super();
    }

    public AppBarBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean setTopAndBottomOffset(int offset) {
        // 重写此方法,判断offset是否超过了最大的可滑动距离,如果超过就不再滑动
        if(maxScrollH <= Math.abs(offset)){
            offset = - maxScrollH;
        }
        return super.setTopAndBottomOffset(offset);
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) {

        return super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type);
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {

        return super.onTouchEvent(parent, child, ev);
    }

    @Override
    public boolean onMeasureChild(CoordinatorLayout parent, AppBarLayout child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {

        return super.onMeasureChild(parent, child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
    }

    @Override
    public boolean onLayoutChild(CoordinatorLayout parent, AppBarLayout abl, int layoutDirection) {
        calculateMaxScrollH(parent, abl);
        return super.onLayoutChild(parent, abl, layoutDirection);
    }
    
    // 计算最大的可滑动距离
    private void calculateMaxScrollH(CoordinatorLayout parent, AppBarLayout child){
        viewPager = parent.findViewById(R.id.vp_content);
        radioGroup = child.findViewById(R.id.rg_comment);

        int parentH = parent.getMeasuredHeight();
        /**
         * 获取AppBarLayout可滑动的最大值,得到的值:AppBarLayout的高度去掉悬浮的那块高度
         * 正好可以保证AppBarLayout完全隐藏掉并且悬浮布局显示
         */
        int childScrollTotalH = child.getTotalScrollRange();

        MainFragmentPagerAdapter adapter = (MainFragmentPagerAdapter) viewPager.getAdapter();
        CommentFragment fragment = (CommentFragment) adapter.getItem(0);
        if(fragment.getRecyclerView() != null){
            recyclerViewH = fragment.getRecyclerView().getMeasuredHeight();
        }
        // 最大可滑动距离就是AppBarLayout的高度 + 悬浮布局高度 + recyclerView的高度 - parentH
        maxScrollH = childScrollTotalH - parentH + recyclerViewH + radioGroup.getMeasuredHeight();
        if(maxScrollH < 0){
            maxScrollH = 0;
        }
    }
}

你可能感兴趣的:(CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+ViewPager中空白过大的问题)