我有一个ViewPager
(扩展了FragmentPagerAdapter
),其中包含两个Fragments
。我需要的只是在我扫过每个ListView
时刷新它们的Fragment
。为此,我实现了ViewPager.OnPageChangeListener
接口(interface)(即onPageScrollStateChanged
)。为了保留对Fragment
的引用,我使用了HashTable
。我将对Fragments
的引用存储在HashTable
方法的getItem()
中:
@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;
}
}
因此,当我从一种
Fragment
滑动到另一种onPageScrollStateChanged
时,会触发HashTable
,在其中我使用Fragments
调用两种orientation change
中的必需方法(刷新): public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
一切正常,直到
refresh()
事件发生。之后的是IllegalStateException
方法中的代码,即:public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
结果为
Content
: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)
假设确实未创建
boolean
View ,我将onActivityCreated()
方法中的true
变量设置为if/else
并使用getListView()
条件调用或不调用FragmentPagerAdapter
,这表明 Activity 和内容 View 已成功创建。然后,我正在调试,以查看
getItem()
何时调用orientation change
,并且碰巧在ViewPager
事件之后未调用该方法。因此,看起来Fragments
拥有对旧ViewPager
的引用。这只是我的假设。因此,是否有任何方法可以强制
getItem()
再次调用Fragments
,因此我可以使用对当前ojit_code的适当引用?可能是其他解决方案?非常感谢你。 最佳答案
fragment 应自动重新创建,就像任何 fragment 在配置更改中一样。异常(exception)是,如果您使用setRetainInstance(true)
,则在这种情况下,它们应该是与以前相同的 fragment 对象。
那里的 fragment 怎么了?
关于android - FragmentPagerAdapter不会在方向更改时重新创建 fragment 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12254494/