Android ViewPager.OnPageChangeListener在ViewPager完成初始化之前运行

Android ViewPager.OnPageChangeListener在ViewPager完成初始化之前运行,android,android-viewpager,fragment,Android,Android Viewpager,Fragment,我在活动中的ViewPager中添加OnPageChangeListener public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... mPageAdapter = new PageAdapter(fragmentManager); mPager = (ViewPager) findViewById(R.id.pager); mPage

我在活动中的ViewPager中添加OnPageChangeListener

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    mPageAdapter = new PageAdapter(fragmentManager);
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mPageAdapter);
    mPager.setOffscreenPageLimit(CACHE_SIZE);
    mPager.addOnPageChangeListener(mOnPageChangeListener);
    ...


private ViewPager.SimpleOnPageChangeListener mOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int i) {
        Log.d(TAG, "this: " + this);
        ChartFragment chartFragment = mFragmentList.get(i).second; // crash when activity recreate............
        ...
我把所有片段都存储在一个列表中

private List<Pair<String, ChartFragment>> mFragmentList = new ArrayList<Pair<String, ChartFragment>>();

private class PageAdapter extends FragmentPagerAdapter {
    public Object instantiateItem(ViewGroup container, int position) {
        mFragmentList.add(new Pair<String, ChartFragment>(...));
ViewPager.onRestoreInstanceState中的onPageSelected函数调用

10-15 13:22:57.745 D/MyAccountActivity( 8998):  at ...MyActivity$1.onPageSelected(MyActivity.java:103)
10-15 13:22:57.745 D/MyAccountActivity( 8998):  at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1792)
10-15 13:22:57.745 D/MyAccountActivity( 8998):  at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:547)
10-15 13:22:57.745 D/MyAccountActivity( 8998):  at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
10-15 13:22:57.745 D/MyAccountActivity( 8998):  at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1319)

在为ViewPager添加PageChangeListener之前,请确保“MFFragmentList”中的数据可用

在下一行之前的“
MFFragmentList
”中获取数据加载

mPager.addOnPageChangeListener(mOnPageChangeListener);

@icetea先生,日志上说“MFFragmentList大小为0”,因为InstanceItem尚未运行。如果您的崩溃是由于indexoutofBounds造成的,请检查类似“MFFragmentList.get(i).second”。@RaghuRamiReddy我当然知道这一点。我只是想知道为什么函数onPageSelected exec在ViewPager“init”之前。@RaghuRamiReddy如果ViewPager完成init,那么运行onPageSelected,一切都会好的;正在初始化ViewPager,onPageSelected正在调用活动加载的第一页。谢谢。但是如何。。。这就是我想知道的。我应该在哪里调用addOnPageChangeListener。我需要等待ViewPager中的所有项目实例化。我找不到此项的回调函数。请添加“PageAdapter”。这将有助于识别“MFFragmentList”中填充数据的位置。请显示“InstanceItem()”何时调用。除了将片段添加到列表中,您可以再添加一个方法来获取当前片段,如下所示。请查看以下链接答案中的“getFragment()”方法:
mPager.addOnPageChangeListener(mOnPageChangeListener);