微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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?

这些碎片有什么问题?

原文地址:https://www.jb51.cc/android/318373.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐