Android 所有片段的Viewpager动态高度(如谷歌日历)

Android 所有片段的Viewpager动态高度(如谷歌日历),android,android-fragments,calendar,Android,Android Fragments,Calendar,也许我不能在标题中解释这个问题 我正在开发一个日历应用程序,该日历的分页由ViewPager完成。 首先,我无法排列ViewPager的高度,因为它填充了所有的换页内容,所以我编写了一个自定义ViewPager,但出现了一个新问题 如下图所示,日历中的某些月份有6行,但gridview中的某些月份有7行。它根据一天的开始、月份的总天数等进行更改 如果行号计数为7,我想放大它的大小;如果行号计数为6,我想缩小它的大小。谷歌日历可以做到这一点 下面是我的CustomViewPager public

也许我不能在标题中解释这个问题

我正在开发一个日历应用程序,该日历的分页由ViewPager完成。 首先,我无法排列ViewPager的高度,因为它填充了所有的换页内容,所以我编写了一个自定义ViewPager,但出现了一个新问题

如下图所示,日历中的某些月份有6行,但gridview中的某些月份有7行。它根据一天的开始、月份的总天数等进行更改

如果行号计数为7,我想放大它的大小;如果行号计数为6,我想缩小它的大小。谷歌日历可以做到这一点

下面是我的CustomViewPager

public class CustomCalendarViewPager extends ViewPager {
    public CustomCalendarViewPager( Context context ) {
        super( context );
    }

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

    @Override
    protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ) {

        super.onMeasure( widthMeasureSpec, 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();
            int leap_space = Math.round( ( h / 4 ) );
            if ( h > height ) height = ( h * 7 ) + leap_space;

        }
        heightMeasureSpec = MeasureSpec.makeMeasureSpec( height, MeasureSpec.EXACTLY );
        super.onMeasure( widthMeasureSpec, heightMeasureSpec );
    }
}
在ViewPager上设置,并在onPageSelected覆盖中,调用requestLayout和invalidate以强制寻呼机重新测量其高度


在onMeasure中,使用当前选择的项目设置高度。

我调用了OnPageSelected中的requestLayout和invalidate函数,但我不知道我将在onMeasure中做什么。我编辑了我的问题。基本上不是循环所有项目来获取高度,而是获取索引处项目的高度getCurrentItemgetCurrentItem函数只返回当前位置。我尝试了测量和设置测量尺寸的方法。我读了这个=>和这个=>请你告诉我在测量中应该做什么。我已经挣扎了4个小时:我要说的是,不是一个for循环,而是对所有孩子进行测量。只需使用getChildAtgetCurrentItem并测量它。这就是我完全理解你的意思,但它不起作用。它抛出NullPointerException。即使它不起作用,谢谢你的帮助。
calendar_pager.setOnPageChangeListener( new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) {

            }

            @Override
            public void onPageSelected( int position ) {
                System.out.println( "onPageSelected " + position );
                calendar_pager.requestLayout();
                calendar_pager.invalidate();
            }

            @Override
            public void onPageScrollStateChanged( int state ) {

            }
        } );