@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?
这些碎片有什么问题?