VanechikSpace
VanechikSpace

Reputation: 555

How to fix the delay in ViewPager2?

I have small app. Its first activity has RecyclerView. When i tap any item i run a new activity that shows the same data but in ViewPage:

enter image description here

Code in second activity:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crime_pager);

        UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);

        mCrimes = CrimeLab.get(this).getCrimes();

        FragmentManager fragmentManager = getSupportFragmentManager();

        mViewPager = findViewById(R.id.crime_view_pager);
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
            @NonNull
            @Override
            public Fragment getItem(int position) {
                Log.d("qwer", Integer.toString(position));
                Crime crime = mCrimes.get(position);
                return CrimeFragment.newInstance(crime.getId());
            }

            @Override
            public int getCount() {
                return mCrimes.size();
            }
        });


        for(int i = 0; i < mCrimes.size(); i++)
            if(mCrimes.get(i).getId().equals(crimeId))
                mViewPager.setCurrentItem(i);

    }

}

Logcat:

2022-08-22 14:10:37.769 1715-1715/com.bignerdranch.android.criminalintent D/qwer: 5
2022-08-22 14:10:37.770 1715-1715/com.bignerdranch.android.criminalintent D/qwer: 4
2022-08-22 14:10:37.770 1715-1715/com.bignerdranch.android.criminalintent D/qwer: 6

As you can see since we tap fifth item, it has been created first and then items to either side. Appearing fifth item first allows the fifth item to be displayed in an instant with no delay. Then i tried to replace ViewPager with ViewPager2:

enter image description here

Code in second activity with ViewPager2:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crime_pager);

        UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);

        mCrimes = CrimeLab.get(this).getCrimes();

        FragmentManager fragmentManager = getSupportFragmentManager();

        mViewPager2 = findViewById(R.id.crime_view_pager);

        mViewPager2.setAdapter(new FragmentStateAdapter(this) {
            @NonNull
            @Override
            public Fragment createFragment(int position) {
                Log.d("qwer", Integer.toString(position));
                return CrimeFragment.newInstance(mCrimes.get(position).getId());
            }

            @Override
            public int getItemCount() {
                return mCrimes.size();
            }
        });

        for(int i = 0; i < mCrimes.size(); i++)
            if(mCrimes.get(i).getId().equals(crimeId))
                mViewPager2.setCurrentItem(i);

}

Logcat:

2022-08-22 14:24:02.284 2082-2082/com.bignerdranch.android.criminalintent D/qwer: 2
2022-08-22 14:24:02.365 2082-2082/com.bignerdranch.android.criminalintent D/qwer: 3
2022-08-22 14:24:02.410 2082-2082/com.bignerdranch.android.criminalintent D/qwer: 4
2022-08-22 14:24:02.470 2082-2082/com.bignerdranch.android.criminalintent D/qwer: 5
2022-08-22 14:24:02.570 2082-2082/com.bignerdranch.android.criminalintent D/qwer: 6

This time after tapping fifth item we can see the delay,or, more precisely, the scrolling animation due to fifth item created not first but after 2,3 and 4 items accordingly.

How to fix it and make ViewPager2 create the choosen fragment firts to avoid this delay?

Upvotes: 1

Views: 692

Answers (1)

pykereaper
pykereaper

Reputation: 139

setCurrentItem(int item) internally calls setCurrentItem(int item, boolean smoothScroll) with smoothScroll set to true.

So, just replace your setCurrentItem(i) with setCurrentItem(i, false). This way, the animation gets disabled and the ViewPager directly jumps to the desired page.

Upvotes: 1

Related Questions