在开发过程中,有时候页面布局比较复杂,会使用到ScrollView和ViewPager,如果不进行处理,会出现不显示ViewPager的子页面,或者子页面高度一样,内容显示不全,或者是留白太多。我的需求是需要在页面下面加一个可以左右滑动的分栏,而且两个分类的页面高度不一致且不确定。一开始没有考虑,直接就使用了ViewPager,但是子页面什么都没有显示,查了很多资料,说的都是这个问题。解决的方法也很简单,我们只需要去计算一下每个子页面的高度,然后保存起来,在每次切换页面的时候,去设置子页面的高度就可以了,这里自定义了一个ViewPager,也是参考网上大神的,出处忘记了,但是很好用啊。代码如下:
public class CustomViewPager extends ViewPager{
private HashMap<Integer, View> mMap = new LinkedHashMap<>();
private int current;
private int height = 0;
private boolean scrollable = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mMap.size() > current) {
View child = getChildAt(current);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
height = child.getMeasuredHeight();
}
// 得到ViewPager的MeasureSpec,使用固定值和MeasureSpec.EXACTLY,
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
// 重置页面高度
public void resetHeight(int current) {
this.current = current;
if (mMap.size() > current) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
if (layoutParams == null) {
layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
} else {
layoutParams.height = height;
}
setLayoutParams(layoutParams);
}
}
public void setObjectForPosition(View view, int position) {
mMap.put(position, view);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!scrollable) {
return true;
}
return super.onTouchEvent(ev);
}
public boolean isScrollable() {
return scrollable;
}
public void setScrollable(boolean scrollable) {
this.scrollable = scrollable;
}
}
代码相对比较简单,应该都可以看懂的,自定义完之后,使用的方式和原生的ViewPager是一样的,这里不做多余的介绍,只需要在使用的时候多加一个方法,去设置切换页面时调用重置的方法:
mVp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mVp.resetHeight(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
// 默认选中第一个
mVp.resetHeight(0);
这样子就可以做到在切换页面时,子页面的高度和内容的高度一样了。