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性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...