android – FragmentPagerAdapter不会在方向更改时重新创建片段吗?

前端之家收集整理的这篇文章主要介绍了android – FragmentPagerAdapter不会在方向更改时重新创建片段吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ViewPager(扩展FragmentPagerAdapter),它包含两个片段.我需要的是当我在它们之间滑动时为每个片段刷新ListView.为此,我实现了ViewPager.OnPageChangeListener接口(即onPageScrollStateChanged).为了保存对Fragments的引用,我使用了HashTable.我在getItem()方法中存储对HashTable中的Fragments的引用:
@Override
        public Fragment getItem(int num) {
            if (num == 0) {
                Fragment itemsListFragment = new ItemsListFragment();
                mPageReferenceMap.put(num,itemsListFragment);
                return itemsListFragment;
            } else {
                Fragment favsListFragment = new ItemsFavsListFragment();
                mPageReferenceMap.put(num,favsListFragment);
                return favsListFragment;
            }
        }

因此,当我从一个片段滑动到另一个片段时,onPageScrollStateChanged触发我使用HashTable在两个片段中调用所需方法(刷新):

public void refreshList() {
        ((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
        ((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
    }

一切顺利,直到方向改变事件发生.之后是refresh()方法中的代码,它是:

public void refresh() {
        mAdapter.changeCursor(mDbHelper.getAll());
        getListView().setItemChecked(-1,true); // The last row from a exception trace finishes here (my class).
    }

导致IllegalStateException:

java.lang.IllegalStateException: Content view not yet created
        at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
        at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
        at ebeletskiy.gmail.com.passwords.ui.ItemsFavsListFragment.refresh(ItemsFavsListFragment.java:17)

假设确实没有创建Content视图,我将onActivityCreated()方法中的boolean变量设置为true,并使用if / else条件来调用getListView(),这显示了成功创建的活动和内容视图.

然后我正在调试以查看FragmentPagerAdapter何时调用getItem(),并且在方向更改事件之后不会调用方法.所以看起来ViewPager持有对旧片段的引用.这只是我的假设.

那么,有没有办法强制ViewPager再次调用getItem(),所以我可以使用对当前片段的正确引用?可能是其他一些解决方案?非常感谢你.

解决方法

Then I was debugging to see when FragmentPagerAdapter invokes getItem() and it happens the method is not called after orientation change event. So looks like it ViewPager holds references to old Fragments.

应该自动重新创建片段,就像配置更改中的任何片段一样.例外情况是你使用了setRetainInstance(true),在这种情况下它们应该是和以前一样的片段对象.

So,is there any way to enforce the ViewPager to call getItem() again,so I can use proper references to current Fragments?

这些碎片有什么问题?

猜你在找的Android相关文章