FragmentPagerAdapter:java.lang.IllegalStateException:应用程序的PagerAdapter更改了适配器的内容

时间:2014-05-20 09:54:41

标签: android android-fragments android-viewpager navigation-drawer

尝试使用导航抽屉内的视图寻呼机创建应用程序。我有选择从导航中选择(取决于那个(外部选择)),我必须在视图寻呼机中填充不同数量的片段。

我使用教程分别从Google文档创建导航抽屉和查看分页器。根据文档,视图寻呼机具有固定数量的片段。如果我用这种方式硬编码一切正常。

但是,当我尝试按照左选择使其动态时,我正在获得非法状态异常

例如,我已经实现了fragmentstatepageradapter,

 public class innerFragment extends Fragment {

    SectionsPagerAdapter mSectionsPagerAdapter;
    ViewPager mViewPager;
    public static final String active_outer_option = "section_number";

    public innerFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_outer, container,
                false);

        Log.d("logs", "onCreateView:innerFragment()");

        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(Integer
                .parseInt(getArguments().getString(active_outer_option)));
        Log.d("logs", "onAttach:innerFragment()");
    }

    public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
        private int active_outer_option= 0;

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

        }

        @Override
        public Fragment getItem(int position) {
            Log.d("logs", "getItem(int " + position + ")");

            active_outer_option = position;
            Bundle b = new Bundle();
            b.putString("section_number", "" + position);
            DummySectionFragment fragment = new DummySectionFragment();
            fragment.setArguments(b);
            return fragment;
        }

        @Override
        public int getCount() {
            switch (active_outer_option) {
            case 0:
                return 9;
            case 1:
                return 2;
            case 2:
                return 2;
            case 3:
                return 2;
            case 4:
                return 4;
            default:
                return 0;
            }
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Log.d("logs", "getPageTitle(int " + position + ")");
            return "OP " + String.valueOf(position);
        }

    }

    public static class DummySectionFragment extends Fragment {
        public static final String ARG_SECTION_NUMBER = "section_number";

        public DummySectionFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            Log.d("logs", "onCreateView:DummySectionFragment()");

            View rootView = inflater.inflate(R.layout.fragment_inner,
                    container, false);
            TextView dummyTextView = (TextView) rootView
                    .findViewById(R.id.section_label);
            dummyTextView.setText(getArguments().getString(ARG_SECTION_NUMBER));
            return rootView;
        }

    }

}

当我运行这个应用程序时,它给出了“遗憾的应用程序停止工作”,例外是:

java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 9, found: 2 Pager id: com.xxx.xxx:id/pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.xxx.xxx.innerFragment$SectionsPagerAdapter

这个例外和代码有什么问题吗?

编辑:

从我的调试开始,一切都很好,gettitle用索引0和1调用两次,然后用索引调用getcount并获得异常。

这会响铃吗?

0 个答案:

没有答案