ViewPager2 отображает только два фрагмента при изменении ориентации? - PullRequest
0 голосов
/ 17 июня 2020

Мой 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();
}
}
...