ViewPager2 setOffscreenPageLimit() doesn't seem to work

Viewed 6207

I'm using a ViewPager2 in my Android app to let the user scroll left and right through (currently) 2 pages. It seems fine, except for one little detail.

I'm using setOffscreenPageLimit(2) because I want both pages to be ready for scrolling straight away. However, it doesn't seem to do anything. When I scroll from page 1 to page 2 for the first time, the second page's layout doesn't appear until it's fully selected (i.e. the transition animation is finished). This looks quite jarring, and defeats the point of smooth scrolling with a ViewPager2 at all.

After page 2 loads for the first time, scrolling back and forth works properly with both pages being retained allowing a smooth transition.

Can anyone replicate this? This used to work just fine with ViewPager.

Here's how I set up my ViewPager2:

_viewPager2FragmentHolder = getActivity().findViewById(R.id.viewPager2TargetFragmentHolder);
_viewPager2FragmentHolder.setOffscreenPageLimit(2);
_viewPager2FragmentHolder.setAdapter(new TargetFragmentStateAdapter(this));

...and here's my adapter class:

public class TargetFragmentStateAdapter extends FragmentStateAdapter
{
    public TargetFragmentStateAdapter(@NonNull Fragment fragment)
    {
        super(fragment);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position)
    {
        switch (position)
        {
            case 0:
                return new TargetCoordinatesFragment();

            case 1:
                return new TargetDirectionsFragment();

            default:
                return new Fragment();
        }
    }

    @Override
    public int getItemCount()
    {
        return 2;
    }
}
1 Answers

From the official documentation: https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2#setOffscreenPageLimit(int)

Set the number of pages that should be retained to either side of the currently visible page(s). Pages beyond this limit will be recreated from the adapter when needed.

Therefore, you should set it to 1 to get what you want. If offscreen pages seems to be 'loaded' only when selected, it means either the adapter or the pageSelectionCallback is doing somethiong wrong.

Related