带有ViewPager的TabLayout无法按预期工作

问题描述 投票:0回答:3

在我的申请中有3个TabLayoutViewPager

如果我滑动更改Tabs然后它表现得很奇怪。

以下是场景。

让我们说3个标签A,B,C。

启动App时,默认选项卡A将打开。

从A转到B - 工作正常。 转到A从B - 工作正常。 从A转到B - 工作正常。 从B转到C - 工作正常。

现在问题从这里开始。 从C转到B - 它将加载A和B两者但仅显示B.

如果我来自C ??为什么A和B会加载?

以下是我的代码。

private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    ViewPagerAdapter adapter;

toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(false);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

private void setupViewPager(ViewPager viewPager) {
        adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new FragmentOpen(), "OPEN");
        adapter.addFragment(new FragmentClose(), "CLOSE");
        adapter.addFragment(new FragmentTest(), "TEST");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

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

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

我想每次都加载Tabs。 为此,我使用下面的代码。

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if(adapter != null){
                    adapter.getItem(position).onResume();
                }
                Toast.makeText(getApplicationContext(), "Page Selected", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

但是当我来自C时,它总是会加载两个标签。

我想要的是:只有Tab B必须加载来自C,而不是两者。

android android-viewpager android-tablayout
3个回答
1
投票

使用ViewPager时不可能。根据你的滑动方向,ViewPager至少加载one右/左adjacent片段的current片段。

如果你阅读ViewPager文档,有一个方法ViewPager.setOffscreenPageLimit(LIMIT)支持屏幕页面限制,其default值是1

SetOffscreenPageLimit:

在空闲状态下设置应保留到视图层次结构中当前页面任一侧的页数。超出此限制的页面将在需要时从适配器重新创建。

这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上使用延迟加载机制,那么调整此设置可以获得分页动画和交互的感知平滑性。如果您有少量页面(3-4)可以一次保持活动状态,那么当用户来回翻页时,新创建的视图子树的布局花费的时间会更少。

您应该将此限制保持在较低水平,尤其是在页面具有复杂布局的情况下。此设置默认为1。

documentation

以下是一些相关的答案:

1. ViewPager.setOffscreenPageLimit(0) doesn't work as expected

2. How can make my ViewPager load only one page at a time ie setOffscreenPageLimit(0);

3. How does setOffscreenPageLimit() improve ViewPager performance by retaining more offscreen Fragments?


1
投票

它的默认行为ViewPager如果你在A然后它也加载B而当你的到达B它将加载C和A也加载现在当到达C时它会破坏A的视图然后当你再来到B它将以一种简单的方式再次加载A ViewPager维持一个Next和一个previous默认状态。

要克服这一点,你应该使用ViewPager.setOffscreenPageLimit(number)这里的数字是为下一个和上一个视图模拟加载的页面数。


0
投票

我只有3个标签,并且设置ViewPager.setOffscreenPageLimit(2)为我工作。

试试ViewPager.setOffscreenPageLimit(totTabs - 1)

© www.soinside.com 2019 - 2024. All rights reserved.