This viewpager is already running perfectly.
I want to migrate from viewpager to viewpager2. But there is a problem when I scroll viewpager2 left/right, the tables in the fragment sometimes appear sometime not. Is there something wrong with my code?
ViewPager(old) - this is running perfectly
private static class SettingAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragmentList = new ArrayList<>();
private List<String> titleList = new ArrayList<>();
public SettingAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
@NonNull
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
public void addFragment(@NonNull Fragment fragment, @NonNull String title) {
fragmentList.add(fragment);
titleList.add(title);
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position);
}
}
SettingAdapter call from onCreateView in Fragment (old)
titles = getSettingTabTitlesRes(context);
adapter = new SettingAdapter(getChildFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
if (titles.length == 15) {
adapter.addFragment(new NetworkFragment(), titles[0]);
adapter.addFragment(new PopulationsFragment(), titles[1]);
adapter.addFragment(new BankFragment(), titles[2]);
adapter.addFragment(new PetrolStationFragment(), titles[3]);
adapter.addFragment(new DispenserFragment(), titles[4]);
adapter.addFragment(new ProductFragment(), titles[5]);
adapter.addFragment(new EmployeeFragment(), titles[6]);
adapter.addFragment(new NozzleFragment(), titles[7]);
adapter.addFragment(new PaymentMethodFragment(), titles[8]);
adapter.addFragment(new WorkScheduleFragment(), titles[9]);
adapter.addFragment(new ReceiptPaperFragment(), titles[10]);
adapter.addFragment(new CustomersFragment(), titles[11]);
adapter.addFragment(new UserAccountFragment(), titles[12]);
adapter.addFragment(new LicenseFragment(), titles[13]);
adapter.addFragment(new HelpFragment(), titles[14]);
}
binding.settingViewpager.setAdapter(adapter);
binding.settingTablayout.setupWithViewPager(viewPager);
ViewPager2(new) - PROBLEM IN HERE..
private static class SettingAdapter extends FragmentStateAdapter {
public SettingAdapter(@NonNull Fragment fragment) {
super(fragment);
}
@NonNull
@Override
public Fragment createFragment(int position) {
Log.i("xxx", "createFragment: " + position);
switch (position) {
default:
case 0:
return new NetworkFragment();
case 1:
return new PopulationsFragment();
case 2:
return new BankFragment();
case 3:
return new PetrolStationFragment();
case 4:
return new DispenserFragment();
case 5:
return new ProductFragment();
case 6:
return new EmployeeFragment();
case 7:
return new NozzleFragment();
case 8:
return new PaymentMethodFragment();
case 9:
return new WorkScheduleFragment();
case 10:
return new ReceiptPaperFragment();
case 11:
return new CustomersFragment();
case 12:
return new UserAccountFragment();
case 13:
return new LicenseFragment();
case 14:
return new HelpFragment();
}
}
@Override
public int getItemCount() {
return 15;
}
}
SettingAdapter call from onCreateView in Fragment (new)
String[] titles = getSettingTabTitlesRes(context);
settingAdapter = new SettingAdapter(this);
binding.settingViewpager.setOffscreenPageLimit(2);
binding.settingViewpager.setAdapter(settingAdapter);
new TabLayoutMediator(binding.settingTablayout, binding.settingViewpager, (tab, position) -> {
tab.setText(titles[position]);
}).attach();
Screenshots when use Viewpager2
Migrate from ViewPager to ViewPager2bookmark_border
ViewPager2
is an improved version of the ViewPager
library that offers enhanced functionality and addresses common difficulties with using ViewPager
. If your app already uses ViewPager
.