我有一个ViewPager
(扩展了FragmentPagerAdapter
),其中包含两个Fragments
。我需要的是当我在它们之间滑动时,只需刷新每个Fragment
中的一个ListView
。为此,我实现了ViewPager.OnPageChangeListener
接口(即onPageScrollStateChanged
)。为了保存对Fragment
s的引用,我使用了一个HashTable
。我在getItem()
方法中将Fragments
的引用存储在HashTable
中:
@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
滑动到另一个Fragment
时,会触发onPageScrollStateChanged
事件,我使用HashTable
在两个Fragments
中调用所需的方法(刷新):
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()”方法中设置了布尔变量为“true”,并使用“if/else”条件来调用“getListView()”或不调用,“这表明活动和内容视图成功创建。
然后我进行调试,看看“FragmentPagerAdapter”何时调用“getItem()”,发现该方法在“方向更改”事件后未被调用。所以看起来像是“ViewPager”保留了旧的“Fragments”的引用。这只是我的假设。
那么,有没有办法强制“ViewPager”重新调用“getItem()”,以便我可以使用当前“Fragments”的正确引用?也许还有其他解决方案?非常感谢。
setRetainInstance()
。问题出在方向改变
后弹出的异常上。我只是假设旧的片段正在使用中,因为我检查了onActivityCreated()
的条件,它们都被执行了。 - Eugenerefresh()
方法?以及你什么时候将新创建的片段提取出来以填充你那个(呕)Hashtable
? - CommonsWareonPageScrollStateChanged()
方法中调用了refresh()
方法(该方法是ViewPager.OnPageChangeListener
接口的实现,即当我在Fragments
之间滑动时)。并且我在扩展FragmentPagerAdapter
类的getItem()
方法中填充了HashTable
。 - EugenesetRetainInstance(true)
,现在不再出现这样的异常了,这证实了我的假设:在方向更改
后,Hashtable
中的引用已经过时。但仍然很好奇如何在没有使用setRetainInstance(true)
的情况下处理这种情况。 - EugeneListView
小部件分配唯一标签,然后在ViewPager
上使用findViewWithTag()
查找它们,而不是维护自己的单独集合。 - CommonsWare