Android 带ViewPager的TableLayout未按预期工作
在我的应用程序中有3个Android 带ViewPager的TableLayout未按预期工作,android,android-viewpager,android-tablayout,Android,Android Viewpager,Android Tablayout,在我的应用程序中有3个TabLayout和ViewPager 如果我滑动更改选项卡,则它的行为异常 下面是场景 比如说3个标签A,B,C 启动应用程序时,默认选项卡A将打开 从A转到B-工作正常。 从B转到A-工作正常。 从A转到B-工作正常。 从B转到C-工作正常。 现在问题从这里开始。 从C转到B-它将同时加载A和B,但仅显示B。 如果我来自C,为什么A和B会加载 下面是我的代码 private Toolbar toolbar; private TabLayout tabLayout
TabLayout
和ViewPager
如果我滑动更改选项卡,则它的行为异常
下面是场景
比如说3个标签A,B,C
启动应用程序时,默认选项卡A将打开
从A转到B-工作正常。从B转到A-工作正常。
从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);
}
}
但是当我从C来的时候,它总是会同时加载两个标签
我想要的是:当来自C时,只有选项卡B必须加载,而不是两者都加载
使用
ViewPager
时,这是不可能的ViewPager
根据您的滑动方向至少加载当前片段的右/左相邻片段
如果阅读ViewPager
文档,则有一种方法ViewPager.setOffscreenPageLimit(LIMIT)
支持屏幕外页面限制,其默认值为1
SetOffscreenPageLimit:
设置应保留到页面两侧的页数
视图层次结构中处于空闲状态的当前页面。除此之外的页面
需要时,将从适配器重新创建限制
这是作为一种优化提供的。如果你事先知道号码
您将需要支持的页面的数量,或者在其中具有延迟加载机制
放置在您的页面上,调整此设置在
感知到分页动画和交互的平滑度。如果你有
少量页面(3-4页)可同时保持活动状态,
新创建的视图子树的布局时间将减少
用户来回翻页
您应该将此限制保持在较低的水平,尤其是当您的页面具有复杂的
布局。此设置默认为1
看
以下是一些相关的答案:
1.
2.
3.使用ViewPager
时不可能ViewPager
根据您的滑动方向至少加载当前片段的右/左相邻片段
如果阅读ViewPager
文档,则有一种方法ViewPager.setOffscreenPageLimit(LIMIT)
支持屏幕外页面限制,其默认值为1
SetOffscreenPageLimit:
设置应保留到页面两侧的页数
视图层次结构中处于空闲状态的当前页面。除此之外的页面
需要时,将从适配器重新创建限制
这是作为一种优化提供的。如果你事先知道号码
您将需要支持的页面的数量,或者在其中具有延迟加载机制
放置在您的页面上,调整此设置在
感知到分页动画和交互的平滑度。如果你有
少量页面(3-4页)可同时保持活动状态,
新创建的视图子树的布局时间将减少
用户来回翻页
您应该将此限制保持在较低的水平,尤其是当您的页面具有复杂的
布局。此设置默认为1
看
以下是一些相关的答案:
1.
2.
3.
它的默认行为是ViewPager
,如果您在A中,那么它将加载B
同时,当你到达B时,它将加载C,A现在也加载
当到达C时,它会破坏A的视图,现在当你来的时候
再次加载到B,它将以一种简单的方式再次加载A
默认情况下,一个Next
和一个previous
视图状态
要克服这个问题,您应该使用ViewPager.setOffscreenPageLimit(number)
这里number是下一个和上一个视图模拟加载的页面数
它的默认行为是ViewPager
,如果您在A中,那么它将加载B
同时,当你到达B时,它将加载C,A现在也加载
当到达C时,它会破坏A的视图,现在当你来的时候
再次加载到B,它将以一种简单的方式再次加载A
默认情况下,一个Next
和一个previous
视图状态
要解决这个问题,您应该使用ViewPager.setOffscreenPageLimit(number)
这里number是下一个和上一个视图模拟加载的页面数。我只有3个选项卡,设置ViewPager.setOffscreenPageLimit(2)
对我有效
试试看ViewPager.setOffscreenPageLimit(tottables-1)
我只有3个选项卡,而设置ViewPager.setOffscreenPageLimit(2)
对我很有效
请尝试ViewPager.setOffscreenPageLimit(totTabs-1)
这是因为ViewPager加载当前选项卡以及下一个可见选项卡的数据。您的表布局位于活动或片段内?。getItem(position.onResume();这不是更改片段的最佳方法,您应该替换片段。@Jonathanase它位于“活动”内部。这是因为ViewPager加载了当前选项卡以及下一个可见选项卡的数据。您的tabLayout位于“活动”或“片段”内部?。getItem(position.onResume();这不是更改片段的最佳方式,您应该替换片段。@Jonathanase它在活动中。您能为这一点提供任何替代方案吗?我想阻止加载选项卡。如果我滑动选项卡,它将不会加载任何选项卡。您可以尝试使用界面
。在活动中编写接口
,并从片段
类中实现它。将addOnPageChangeListener添加到viewpager,将SetOnAbsSelectedListener添加到TableLayout。从那些李斯特
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) {
}
});