在我的申请中有3个TabLayout
和ViewPager
。
如果我滑动更改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,而不是两者。
使用ViewPager
时不可能。根据你的滑动方向,ViewPager
至少加载one
右/左adjacent
片段的current
片段。
如果你阅读ViewPager
文档,有一个方法ViewPager.setOffscreenPageLimit(LIMIT)
支持屏幕页面限制,其default
值是1
。
SetOffscreenPageLimit:
在空闲状态下设置应保留到视图层次结构中当前页面任一侧的页数。超出此限制的页面将在需要时从适配器重新创建。
这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上使用延迟加载机制,那么调整此设置可以获得分页动画和交互的感知平滑性。如果您有少量页面(3-4)可以一次保持活动状态,那么当用户来回翻页时,新创建的视图子树的布局花费的时间会更少。
您应该将此限制保持在较低水平,尤其是在页面具有复杂布局的情况下。此设置默认为1。
以下是一些相关的答案:
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);
它的默认行为
ViewPager
如果你在A然后它也加载B而当你的到达B它将加载C和A也加载现在当到达C时它会破坏A的视图然后当你再来到B它将以一种简单的方式再次加载AViewPager
维持一个Next
和一个previous
默认状态。
要克服这一点,你应该使用ViewPager.setOffscreenPageLimit(number)
这里的数字是为下一个和上一个视图模拟加载的页面数。
我只有3个标签,并且设置ViewPager.setOffscreenPageLimit(2)
为我工作。
试试ViewPager.setOffscreenPageLimit(totTabs - 1)