FragmentPagerAdapter - 当用户转到新标签时如何检测滑动或标签点击?

dow*_*123 18 android android-tabhost android-fragments android-viewpager android-pageradapter

我有一个MainActivity有三个片段FragmentPagerAdapter如下所示.如何通过滑动或单击选项卡,如何找出用户从第一个片段到第二个片段或从第二个片段到第二个片段的时间?我看到这个getItem()方法并没有像我声明的那样被调用mViewPager.setOffscreenPageLimit(2);

public class MainThreeTabAdapter extends FragmentPagerAdapter {

    private final String[] CONTENT = new String[]{"News", "Rewards", "Me"};

    public MainThreeTabAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        if (position == 0) {
            return NewsFragment.newInstance();
        } else if (position == 1) {
            return RewardsFragment.newInstance();
        } else if (position == 2) {
            return MeFragment.newInstance(true, App.getAccountData().getId());
        } else {
            return null;
        }

    }

    @Override
    public CharSequence getPageTitle(int position) {
        return CONTENT[position % CONTENT.length];
    }

    @Override
    public int getCount() {
        return CONTENT.length;
    }
}
Run Code Online (Sandbox Code Playgroud)

在MainActivity中 onCreate()

    mainThreeTabAdapter = new MainThreeTabAdapter(getFragmentManager());

    // Set up the ViewPager with the sections adapter.
    // this ensures that 2 tabs on each side of current are kept in memory, which is all we need for our case. Default = 1
    // this is all taken from the Quickreturn facebook sample app
    mViewPager.setOffscreenPageLimit(2);
    mViewPager.setAdapter(mainThreeTabAdapter);
Run Code Online (Sandbox Code Playgroud)

And*_*tor 27

getItem()仅在创建视图时调用该方法.要理解为什么getItem()没有被调用,有助于理解a的默认行为ViewPager.默认情况下,当您在某个特定页面上时,ViewPager它还会创建此特定页面之前和之后的页面.如果您要按顺序命名3个片段[a,b,c],并且您在第b页,由于ViewPager片段的默认行为,已经通过调用创建了片段a和c getItem(int).因为片段已经创建,所以不会再接到另一个电话getItem()

除此之外:可以使用修改此行为 ViewPager.setOffScreenLimit()

为了在用户切换页面时收到通知,您实际想要做的是将a设置OnPageChangeListenerViewPager使用ViewPager.addOnPageChangeListener()以在选择页面时得到通知.

  • 现在不推荐使用`setOnPageChangeListener()`.应该使用`addOnPageChangeListener()`代替 (11认同)