ViewPager与可展开的子项

5
我正在尝试创建可折叠的日历。
我在ViewPager中使用自定义calendarView,在展开/折叠按钮按下时,我的calendarView会动画折叠除了一个星期之外的所有日历周。
目标是在展开时滑动月份(这正如我想要的那样),在折叠时滑动星期。
下面的calendarView是带有一些事件的ListView,当用户折叠日历时,listView的高度必须更改。
问题是当我试图在ViewPager中折叠calendarView时,它不会改变高度。
calendarView是一个LinearLayout,具有子视图,当它不在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();
        if(h > height) height = h;
    }

    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

我试图在calendarView上重写onMeasure方法,使用不同的动画效果,尝试直接改变ViewPager布局但是没有成功。

请帮我解决这个问题,也许有什么窍门可以解决。

我找到了这个这个这个以及更多的问题。

我的问题和这个问题非常相似。

1个回答

9

最终我找到了解决方法,或许会对您有所帮助。

这是我的PagerAdapter:

class CustomAdapter extends PagerAdapter {

    private View mCurrentView;

    ...

    // Saving current active item
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        mCurrentView = (View) object;
    }

     public View getCurrentItem() {
        return mCurrentView;
    }

}

这是我的ViewPager类

class CustomViewPager extends ViewPager {

    private CustomViewPagerAdapter mAdapter;

    ...

    // Set ViewPager height to currentItem
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        View v = mAdapter.getCurrentItem();
        if(v != null) {
            v.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            height = v.getMeasuredHeight();
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

使用此方法,我可以折叠/展开ViewPager的子项,并且它将正确地测量其高度,并在页面更改时带有一定的延迟进行测量。

非常感谢,您的解决方案确实有帮助。稍微修改了一下以使其与 FragmentPagerAdpter 一起工作。 - Monica M
嘿,伙计,我想尝试你的解决方案,但我想知道如何使用你的适配器。谢谢。 - Antwan
请像往常一样使用您的Pager适配器,只需添加我提供的代码即可。 - Jonez
@MonicaM,你能分享一下你是如何使用FragmentPagerAdapter实现的吗? - TaRan LaYal
@John61590 我跳过了那段代码,你必须自己初始化它。 - Jonez
@Jonez,你不能真的将它传递到ViewPager中。这有点尴尬。所以,我不知道你在尝试做什么。 - John61590

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接