带 Tablayout 的 Viewpager 无法正常工作

Viewpager with Tablayout not working proper

这里我得到的结果是...

  1. Activity开始..

    当时这两个片段调用 -> 片段 1 加载 -> 片段 2 在后台加载

  2. 向右交换(意味着从片段 1 到片段 2)

    当时我在片段二而且是同一时间 -> 片段 3 在后台加载

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