【问题标题】:RecyclerView inside viewpager视图分页器内的 RecyclerView
【发布时间】:2018-07-30 10:01:16
【问题描述】:

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

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

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

我试试这个: nestedScrollView.isFillViewport = trueRecyclerViewViewpager 顶部滚动。

【问题讨论】:

  • 您希望 Recycler View 的高度为 wrap_content?
  • @Khemraj 。我想要RecyclerView滚动NestedScrollView
  • 好的,你想要NestedScrolling false,这也会使 RecyclerView wrap_content。复杂的问题,需要做一些工作。
  • 不理解问题的人,他们投反对票。奇怪!
  • 他们实际上是盲人。我有时也会发生这种情况。

标签: android android-recyclerview kotlin android-viewpager android-nestedscrollview


【解决方案1】:

我前段时间遇到过这个问题。您希望 RecyclerView 滚动到 NestedScrollView 的位置。而nestedScrollingEnabled 不会帮助你,因为RecyclerViewViewPager. 里面

解决方案您可以自定义ViewPager 以将ViewPager 的大小调整为从该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函数。

    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

【讨论】:

  • 感谢您的帮助。但在我的应用程序中,min sdk 为 19,android:nestedScrollingEnabled="false 需要 21
  • 只需将其放在 xml android:nestedScrollingEnabled 中,然后使用上述答案尝试低于 19 的 api。
  • 你指的是哪种情况
  • isFillViewport 设置falseNestedScrollView Viewpager 不显示RecyclerView 并且设置isFillViewport=true RecyclerView 根本不滚动。
  • 我没有提到在我的回答中使用isFillViewport
【解决方案2】:

在 XML 中的 RecyclerView 上设置这些行

android:nestedScrollingEnabled="false"
android:height="wrap_content"

【讨论】:

【解决方案3】:

让你的布局像这样工作

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多