【问题标题】:Android - tabbedActivity with dynamic number of tabsAndroid - 具有动态选项卡数量的 tabbedActivity
【发布时间】:2015-11-18 16:57:51
【问题描述】:

我正在创建一个应用程序,该应用程序(根据选择的模式)必须在选项卡式活动中具有 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()(在此处标记)时,它在两种情况下都会崩溃。这是我的 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 向导)对于这种情况是否正确?看起来将默认开始选项卡定义为中间,而不是第一个,也会很麻烦(但这当然是另一个问题,在我解决了这个问题之后)。

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

【问题讨论】:

  • 如您的错误所说:The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged,
  • 除此之外,将getCount() 更改为FragmentPagerAdapterFragmentStatePagerAdapter 不太可能正常工作。至少,我从来没有运气。我最终编写了自己的 PagerAdapter 实现。
  • 那么使用ActionBar 添加和删除标签更可取吗?实际上,我应该在哪里调用notifyDataSetChanged()?我尝试按照上面的代码所示进行操作,但运气不佳;)

标签: android android-fragments android-tabactivity


【解决方案1】:

我最终创建了两个单独的适配器,在托管活动中调用它们:

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

所以这些 PagerAdapter 只是在 getCount() 不同,当然在各自的地方提供适当的片段(getItem() 方法)。

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多