Проблемы с использованием FragmentStatePagerAdapter, Viewpager внутри Scrollview

Я использую:

  • Макет действий, содержащий фрагмент, добавленный программно.
  • Родительский фрагмент имеет FragmentStatePagerAdapter с пейджером представления. Все содержимое находится внутри ScrollView.
  • Просмотр пейджера заполняется некоторыми дочерними фрагментами, которые имеют Recyclerview.

Проблемы:

  • Просмотр фрагмента пейджера имеет список, поэтому я должен программно установить высоту пейджера родительского представления. Но я не могу этого сделать.

Для этого я использовал

viewpager.getLayoutParams().height = 20000;
viewpager.requestLayout();`

и

ViewGroup.LayoutParams params = viewPagerBottom.getLayoutParams();
params.height =  20000;
viewPagerBottom.setLayoutParams(params);

Кроме того, я попробовал просмотр пейджера и просмотрел свойство высоты фрагментов пейджера как wrap_content

  • Невозможно просмотреть содержимое пейджера, если я не устанавливаю scrollview android:layout_height="match_parent" с помощью android:fillViewport="true".

Это родительский фрагмент layout.xml.

<ScrollView
    style="@style/scrollDefaultStyle"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TabLayout .... />

        <android.support.v4.view.ViewPager
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>
</ScrollView>

Ответ 1

Вы можете настроить ViewPager, чтобы изменить размер ViewPager на текущий размер страницы на странице с помощью .

Вы можете использовать следующий код:

 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) {

                }
            });

Примечание. В ListView могут быть сотни строк. Не рекомендуется использовать wrap_content для ListView. Либо вам нужно указать фиксированную высоту для ListView, либо вам нужно использовать match_parent.