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

Я использую:

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

Проблемы следующие:

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

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

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

и

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

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

  • Не отображается содержимое пейджера просмотра, если я не установил режим прокрутки 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>

person Khemraj Sharma    schedule 24.09.2017    source источник


Ответы (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.

person Jon Goodwin    schedule 18.11.2017