Android - 具有动态数量标签的tabbedActivity

时间:2015-11-18 16:57:51

标签: android android-fragments android-tabactivity

我正在创建一个应用程序(根据所选模式)必须在选项卡式活动中有2个或3个选项卡。当我选择带有三个标签的模式时,一切都很好,但需要2个标签的模式会抛出此异常:

  

java.lang.IllegalStateException:应用程序的PagerAdapter   无需调用就更改了适配器的内容   PagerAdapter#notifyDataSetChanged!预期的适配器项目数:3,   发现:2寻呼机ID:abm.ant8.sotgtests:id / container寻呼机类:class   android.support.v4.view.ViewPager有问题的适配器:类   abm.ant8.sotgtests.MainActivity $ SectionsPagerAdapter

当我注释掉this.notifyDataSetChanged()(标记为HERE)时,它会在两种情况下崩溃。这是我的PagerAdapter代码(我使用的是v4支持包):

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
            mExplanationFragment = ExplanationFragment.newInstance();
            mQuestionFragment = QuestionFragment.newInstance(totalNoOfQuestions);
            if (mode == LEARNING_MODE) {
                mRulesFragment = RulesFragment.newInstance();
            }
            Fragment fragment;

            if (mode == TESTING_MODE) {
                if (position == 1) {
                    fragment = mExplanationFragment;
                } else {
                    fragment = mQuestionFragment;
                }
            } else {
                if (position == 2) {
                    fragment = mExplanationFragment;
                } else if (position == 1){
                    fragment = mQuestionFragment;
                } else  {
                    fragment = mRulesFragment;
                }
            }

            //this.notifyDataSetChanged(); HERE
            return fragment;
        }

        @Override
        public int getCount() {
            if (mode == TESTING_MODE) {
                return 2;
            } else {
                return 3;
            }
        }
        //...
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }
}

这是在应用this SO topic的提示后,其他人看起来非常相似。这种方法(直接来自Android Studio向导)是否适用于这种情况?看起来将默认开始标签定义为中间而不是第一个,这也很麻烦(但在我解决这个问题之后,这当然是另一个问题)。

编辑:作为一个蛮力的解决方案,我想简单地复制当前的Activity并略微修改它,这样它就不会成为一个带有额外意图的Activity,而是调用不同的Activity。 。由于大多数所需的功能已经实现(大部分都是碎片),这绝对是最快的方法。为了保持模块化和清洁,我可以做一些重构,并将两个活动共同的方法移动到单独的类中。

1 个答案:

答案 0 :(得分:1)

我最终创建了两个独立的Adapters,在托管Activity中调用它们:

if (mode == LEARNING_MODE) {
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(1);
} else {
    mTwoSectionsPagerAdapter = new TwoSectionsPagerAdapter(getSupportFragmentManager());
    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mTwoSectionsPagerAdapter);
}

所以这些PagerAdapters在getCount()中有所不同,当然在各个地方提供了适当的片段(getItem()方法)。