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

时间:2017-06-07 14:10:57

标签: android android-viewpager android-tablayout

我的申请中有.valuesTabLayout

如果我滑动更改标签,那么表现得很奇怪

以下是该方案。

假设有3个标签A,B,C。

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

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

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

  

如果我来自C ??

,为什么加载A和B.

以下是我的代码。

ViewPager

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

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

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

  

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

  

如果您在A中,则ViewPager的默认行为会加载B   当你到达B时它将加载C并且A现在也被加载   什么时候到达C它会破坏A的视图,现在当你来的时候   再次向B,它将以一种简单的方式再次加载A ViewPager维护   一个Next和一个previous默认查看状态。

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