我有一个
ViewPager
(扩展了
FragmentPagerAdapter
),里面有两个
Fragments
。我需要的是,当我在每个
Fragment
中滑动时,为它们刷新一个
ListView
。为此我实现了
ViewPager.OnPageChangeListener
接口(即
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
中的必要方法(刷新)。
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).
results in 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()
,碰巧该方法在orientation change
事件后没有被调用。所以看起来像是ViewPager
持有对旧的Fragments
的引用。这只是我的假设。
那么,有没有什么方法可以强制要求ViewPager
再次调用getItem()
,以便我可以对当前的Fragments
使用适当的引用?可能有其他的解决方案吗?非常感谢你。