ViewPager中的RecyclerView [英] RecyclerView inside viewpager

查看:306
本文介绍了ViewPager中的RecyclerView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试实现下图所示的布局.

I try to implement a layout like below image.

在此布局中,第一个ViewPager具有固定高度,第二个Viewpager包含RecyclerView.

in this layout first ViewPager has fix height and second Viewpager contain RecyclerView.

如何将Viewpager中的滚动RecyclerView连接到父级中的NestedScrollView?

How can connect scroll RecyclerView in Viewpager to NestedScrollView in parent?

我尝试这样: nestedScrollView.isFillViewport = true,但RecyclerViewViewpager的顶部滚动.

I try this: nestedScrollView.isFillViewport = true but RecyclerView scroll from top of Viewpager.

推荐答案

我前一段时间已经遇到了这个问题.您要RecyclerView滚动NestedScrollView的位置.并且nestedScrollingEnabled不会帮助您,因为RecyclerView位于ViewPager.

I have faced this issue some time ago. Where you want RecyclerView to be Scrolled by NestedScrollView. And nestedScrollingEnabled will not help you because RecyclerView is inside ViewPager.

解决方案,您可以自定义ViewPager以将ViewPager调整为当前页面大小,方法是从

Solution You can customize the ViewPager to resize the ViewPager to it's current page size on page swipe from this answer.

您可以使用以下代码:

 public class WrapContentViewPager extends ViewPager {

        private int mCurrentPagePosition = 0;

        public WrapContentViewPager(Context context) {
            super(context);
        }

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

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        try {
             boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;
             if (wrapHeight) {
                 View child = getChildAt(mCurrentPagePosition);
                 if (child != null) {
                 child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                 int h = child.getMeasuredHeight();

                 heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
                }
            }
    } catch (Exception e) {
        e.printStackTrace();
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

        public void reMeasureCurrentPage(int position) {
            mCurrentPagePosition = position;
            requestLayout();
        }
    }

在xml中声明:

    <your.package.name.WrapContentViewPager
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    </your.package.name.WrapContentViewPager>

在此之后,滑动页面上的reMeasureCurrentpage函数.

After that call reMeasureCurrentpage function on page swipe.

    final WrapContentViewPager wrapContentViewPager = (WrapContentViewPager) findViewById(R.id.view_pager);

    wrapContentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                @Override
                public void onPageSelected(int position) {
                    wrapContentViewPager.reMeasureCurrentPage(wrapContentViewPager.getCurrentItem());
                }

                @Override
                public void onPageScrollStateChanged(int state) {

                }
            });

还将android:nestedScrollingEnabled="false"设置为RecyclerView.

这篇关于ViewPager中的RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆