Reputation: 555
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
:
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
:
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
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