我有一個ViewPager
(延伸FragmentPagerAdapter
),其中包含兩個Fragments
。我需要刷新ListView
每個Fragment
當我在他們之間滑動。爲此我實現了ViewPager.OnPageChangeListener
接口(即onPageScrollStateChanged
)。爲了保留對Fragment
的引用,我使用了HashTable
。我在HashTable
存儲引用Fragments
在getItem()
方法:FragmentPagerAdapter不會在方向更改上重新創建碎片?
@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).
}
導致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
視圖不確實創建我設置boolean
變量onActivityCreated()
方法true
和使用if/else
條件是否調用getListView()
,其中顯示了成功創建的活動和內容視圖。
然後,我在調試的時候看到FragmentPagerAdapter
調用getItem()
和它發生的方法orientation change
事件發生後沒有被調用。所以看起來像ViewPager
持有對舊Fragments
的引用。這只是我的假設。
那麼,有什麼辦法可以強制ViewPager
再次致電getItem()
,所以我可以適當引用當前的Fragments
?可能是其他解決方案?非常感謝你。
我不在那裏使用'setRetainInstance()'。問題出現在「方向改變」之後彈出的異常。我只是假設舊片段正在使用中,因爲我檢查了兩個都執行'onActivityCreated()'的條件。 – Eugene
@siik:你什麼時候調用這個'refresh()'方法?你什麼時候抽出新創建的片段來填充你的(ick)'Hashtable'? – CommonsWare
我在'onPageScrollStateChanged()'(這是'ViewPager.OnPageChangeListener'接口的實現,即當我在'Fragments'之間滑動時)調用'refresh()'方法。我在'getItem()'類的方法中填充'HashTable',它擴展了'FragmentPagerAdapter' – Eugene