Search code examples
javaandroidandroid-viewpager2

Problem when migrate from ViewPager to ViewPager2


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

Table is invisible Table is visible


Solution

  • 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.

    Follow this documentation