У меня есть виджет ViewPager2 внутри scrollview, высоту которого я хочу установить аналогично содержимому текущего показанного фрагмента. Фрагменты содержат либо gridview, либо listview, высота которого установлена на wrap_content.
Проблема в том, что gridview заполняется содержимым после того, как представление фрагмента было создано, поэтому viewpager получает дочернюю высоту 0. Также высота каждый фрагмент может отличаться от других.
Если я установил высоту просмотра сетки, например, 500dp, все работает нормально.
Есть ли какой-то слушатель, чтобы определить, когда gridview заполнен содержимым / высота gridview изменена, чтобы установить высоту окна просмотра, аналогичную высоте фрагмента?
Я уже пробовал описанные здесь решения
Как обернуть высоту Android ViewPager2 на высоту текущего элемента? и
ViewPager2 с разной высотой элементов и WRAP_CONTENT
Макеты: < br /> ViewPager:
<RelativeLayout>
<androidx.viewpager2.widget.ViewPager2
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/viewPagerID"
android:background="@color/light_blue">
</androidx.viewpager2.widget.ViewPager2>
</RelativeLayout>
ScrollView:
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_navigation_view_bar"
android:id="@+id/center"
android:layout_above="@id/bottom_navigation_view_bar">
<include layout="@layout/layout_viewpager"> </include>
</ScrollView>
Тестовый фрагмент:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<GridView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/black"
android:id="@+id/grid_fragment_0"
android:verticalSpacing="2dp"
android:horizontalSpacing="2dp"
android:stretchMode="columnWidth"
android:gravity="top"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
</GridView>
</RelativeLayout>
Настройте ViewPager
Функция в действии
private void setUpFragmentsTest(){
String[] fragment_names = {"Fragment0", "Fragment1", "Fragment2"};
mViewPager2 = (ViewPager2) findViewById(R.id.viewPagerID);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
SectionsPagerAdapterNew sectionsPagerAdapterNew = new SectionsPagerAdapterNew(this);
sectionsPagerAdapterNew.addFragment(new Fragment0());
sectionsPagerAdapterNew.addFragment(new Fragment1());
sectionsPagerAdapterNew.addFragment(new Fragment2());
mViewPager2.setAdapter(sectionsPagerAdapterNew);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(
tabLayout, mViewPager2, (tab, position) -> {
tab.setText(fragment_names[position]);
});
tabLayoutMediator.attach();
}
Класс адаптера пейджера раздела:
public class SectionsPagerAdapterNew extends FragmentStateAdapter {
private static final String TAG = "SectionsPagerAdapter";
private final List<Fragment> mFragmentList = new ArrayList<>();
public SectionsPagerAdapterNew(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
public SectionsPagerAdapterNew(@NonNull Fragment fragment) {
super(fragment);
}
public SectionsPagerAdapterNew(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
super(fragmentManager, lifecycle);
}
@NonNull
@Override
public Fragment createFragment(int position) {
return mFragmentList.get(position);
}
@Override
public int getItemCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment){
mFragmentList.add(fragment);
}
}