从 ViewPager 迁移到 ViewPager2 时出现问题

Problem when migrate from ViewPager to ViewPager2

这个 viewpager 已经 运行 完美了。

我想从 viewpager 迁移到 viewpager2。但是当我滚动 viewpager2 left/right 时出现问题,片段中的表有时出现有时不出现。我的代码有问题吗?

ViewPager(old) - 这是 运行 完美

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);
    }
}

SettingAdapteronCreateView 调用 Fragment(旧)

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(新)- 这里有问题..

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;
    }
}

SettingAdapteronCreateView 调用 Fragment(新)

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();

使用Viewpager2时的截图

Table is invisible Table is visible

从 ViewPager 迁移到 ViewPager2bookmark_border

ViewPager2ViewPager 库的改进版本,它提供了增强的功能并解决了使用 ViewPager 时的常见问题。如果您的应用已经使用 ViewPager.

Follow this documentation