出现的问题:ViewPager中包含两个Fragment,这两个Fragment的内容是一样的。如果Fragment中没有内容的话,滑上去下面会有一大片空白。如下图1表示未滑动时的效果图,图2表示滑动以后的效果图,图2中下面一片空白,不。
现在需求是滑动时,下面没有数据,就不再滑动从而导致显示整屏空白。
分析:下面没数据时,滑动AppBarLayout,不需要滑动完整个AppBarLayout。那么这个AppBarLayout滑动多少距离合适呢,可滑动距离就是AppBarLayout的高度 + 悬浮布局高度 + recyclerView的高度 - CoordinatorLayout布局的高度,这样保证剩下的正好是个全屏。先看下修改前和修改后的效果图。
以下是代码,带部分注释,有不懂的可以问
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;
}
}
}