【发布时间】:2012-09-03 22:02:33
【问题描述】:
我有一个ViewPager(扩展FragmentPagerAdapter),其中包含两个Fragments。当我在它们之间滑动时,我需要为每个Fragment 刷新一个ListView。为此我实现了ViewPager.OnPageChangeListener 接口(即onPageScrollStateChanged)。为了保存对Fragments 的引用,我使用了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 中调用所需的方法(刷新):
public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
在orientation change 事件发生之前一切正常。之后是refresh()方法中的代码,即:
public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
结果为@987654342@:
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() 并且在 orientation change 事件之后未调用该方法。所以看起来ViewPager 包含对旧Fragments 的引用。这只是我的假设。
那么,有什么办法可以强制ViewPager 再次调用getItem(),这样我就可以使用对当前Fragments 的正确引用了吗?可能是其他一些解决方案?非常感谢。
【问题讨论】:
标签: android