Мой ViewPager2
отображает три Fragments
. При изменении ориентации у меня один Fragment
отображается в другом контейнере (потому что у меня есть ландшафтный макет, который представляет новый контейнер для Fragment
), и я хотел бы, чтобы два других отображались внутри ViewPager2
. Я воссоздаю FragmentStateAdapter
только с двумя элементами, а не с тремя, но по какой-то причине отображаются исходные первые два элемента, а не третий.
Как мне получить, чтобы первый элемент не отображался? Значит, он удален из ViewPager2
, поэтому отображаются только два последних элемента? Android в документации указано, что ViewPager2
должно сделать это возможным, но не объясняет, как.
Код контейнера фрагмента ViewPager2
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
mBinding = FragmentJournalEntryBinding.inflate(inflater, container, false);
// Get View Model
NavController navController = NavHostFragment.findNavController(this);
mViewModel = new ViewModelProvider(navController.getViewModelStoreOwner(R.id.journalEntryNavGraph)).get(JournalEntryViewModel.class);
// ........ skipped unnecessary code
// Set up Thought Entries
ViewPagerAdapter pagerAdapter;
List<ThoughtEntriesFragment> listOfFragments = new ArrayList<>();
if(mBinding.ThoughtsContainer != null){
// Add negative thoughts fragment to the container
if(!(getChildFragmentManager().findFragmentById(R.id.negativeThoughtsContainer) instanceof ThoughtEntriesFragment)){
// Get fragment ready
ThoughtEntriesFragment fragment = ViewPagerAdapter.getFragment(Constants.TYPE_NEGATIVE, mViewModel.isEditMode(), mViewModel.getJournalEntry().getThoughtRecord().getThoughtEntries());
// Add the fragment to the 'fragment_container' FrameLayout
getChildFragmentManager().beginTransaction().add(R.id.negativeThoughtsContainer, fragment).commit();
}
} else {
listOfFragments.add(ViewPagerAdapter.getFragment(Constants.TYPE_NEGATIVE, mViewModel.isEditMode(), mViewModel.getJournalEntry().getThoughtRecord().getThoughtEntries()));
}
listOfFragments.add(ViewPagerAdapter.getFragment(Constants.TYPE_DISTORTION, mViewModel.isEditMode(), mViewModel.getJournalEntry().getThoughtRecord().getThoughtEntries()));
listOfFragments.add(ViewPagerAdapter.getFragment(Constants.TYPE_CHALLENGE, mViewModel.isEditMode(), mViewModel.getJournalEntry().getThoughtRecord().getThoughtEntries()));
pagerAdapter = new ViewPagerAdapter(this, listOfFragments);
// Keeping all tabs in memory to prevent refreshing view. ABSOLUTELY NEEDED
mBinding.ViewPager.setOffscreenPageLimit(listOfFragments.size());
mBinding.ViewPager.setAdapter(pagerAdapter);
new TabLayoutMediator(mBinding.tabDots, mBinding.ViewPager, true, new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
}
}
).attach();
return mBinding.getRoot();
}
Код FragmentStateAdapter
public class ViewPagerAdapter extends FragmentStateAdapter {
List<ThoughtEntriesFragment> mFragments;
public ViewPagerAdapter(@NonNull Fragment fragment, List<ThoughtEntriesFragment> fragments) {
super(fragment);
this.mFragments = fragments;
}
/**
* Sends the fragment in question back to the container. Determined by position
* @param position Page number of fragment
* @return Fragment View of page number position
*/
@NonNull
@Override
public Fragment createFragment(int position) {
return mFragments.get(position);
}
/**
* Creates a ThoughtEntriesFragment object. Loaded with arguments needed to work properly
* @param viewType View Type (Negative, Distortion, Challenging Thoughts)
* @param isEditMode Boolean stating if we are in edit mode or not
* @param thoughtEntries List of our thought entries
* @return ThoughtEntriesFragment
*/
public static ThoughtEntriesFragment getFragment(int viewType, boolean isEditMode, List<ThoughtEntry> thoughtEntries){
Bundle bundle = new Bundle();
ThoughtEntriesFragment fragment = new ThoughtEntriesFragment();
// Pass common variables
bundle.putBoolean(Constants.BUNDLE_ISEDITMODE, isEditMode);
bundle.putSerializable(Constants.BUNDLE_THOUGHTENTRIES, (Serializable) thoughtEntries);
bundle.putInt(Constants.BUNDLE_VIEWTYPE, viewType);
fragment.setArguments(bundle);
return fragment;
}
public List<ThoughtEntriesFragment> getFragments(){
return mFragments;
}
@Override
public int getItemCount() {
return mFragments.size();
}
}