带 Tablayout 的 Viewpager 无法正常工作
Viewpager with Tablayout not working proper
这里我得到的结果是...
Activity开始..
当时这两个片段调用
-> 片段 1 加载
-> 片段 2 在后台加载
向右交换(意味着从片段 1 到片段 2)
当时我在片段二而且是同一时间
-> 片段 3 在后台加载
向右交换(意味着从 Frag 2 到 3 然后)
--> 没有问题。
这是我的代码
主要Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new OneFragment(), "ONE");
adapter.addFragment(new TwoFragment(), "TWO");
adapter.addFragment(new ThreeFragment(), "THREE");
viewPager.setAdapter(adapter);
}
这是我的适配器class
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();
}
// add fragment
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
// for title
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
现在有 3 个片段,那个片段中没有任何内容.....
使用本教程..这可能对您有所帮助
http://www.androidhive.info/2015/09/android-material-design-working-with-tabs/
您无需在 onCreate 方法中包含此行 (删除此行)
viewPager.setCurrentItem(0);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
默认情况下,Viewpager 将设置“0”作为起始索引..
用这个替换你的代码。这在我的应用程序上运行良好:
@Override
protected void onCreate(Bundle savedInstanceState) {
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
assert tabLayout != null;
tabLayout.setupWithViewPager(viewPager);
tabLayout.setSelected(true);
}
并且无需添加 viewPager.setCurrentItem(0);
因为默认情况下 ViewPager 的起始索引将设置为 0。正如 Ajay Jayendran 所说。
希望这能奏效。 (:
ViewPager setOffscreenPageLimit 默认为 1
请查看此link
Visit Documentation
更新
请覆盖此片段方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// load data here
}else{
// fragment is no longer visible
}
}
这里我得到的结果是...
Activity开始..
当时这两个片段调用 -> 片段 1 加载 -> 片段 2 在后台加载
向右交换(意味着从片段 1 到片段 2)
当时我在片段二而且是同一时间 -> 片段 3 在后台加载
向右交换(意味着从 Frag 2 到 3 然后)
--> 没有问题。
这是我的代码
主要Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new OneFragment(), "ONE");
adapter.addFragment(new TwoFragment(), "TWO");
adapter.addFragment(new ThreeFragment(), "THREE");
viewPager.setAdapter(adapter);
}
这是我的适配器class
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();
}
// add fragment
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
// for title
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
现在有 3 个片段,那个片段中没有任何内容.....
使用本教程..这可能对您有所帮助
http://www.androidhive.info/2015/09/android-material-design-working-with-tabs/
您无需在 onCreate 方法中包含此行 (删除此行)
viewPager.setCurrentItem(0);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
默认情况下,Viewpager 将设置“0”作为起始索引..
用这个替换你的代码。这在我的应用程序上运行良好:
@Override
protected void onCreate(Bundle savedInstanceState) {
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
assert tabLayout != null;
tabLayout.setupWithViewPager(viewPager);
tabLayout.setSelected(true);
}
并且无需添加 viewPager.setCurrentItem(0);
因为默认情况下 ViewPager 的起始索引将设置为 0。正如 Ajay Jayendran 所说。
希望这能奏效。 (:
ViewPager setOffscreenPageLimit 默认为 1
请查看此link Visit Documentation
更新 请覆盖此片段方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// load data here
}else{
// fragment is no longer visible
}
}