我已按照these steps创建了ViewPager
,但我遇到的问题是,当设备配置发生变化(例如设备轮换)时,重新启动加载程序。
这不仅会导致不必要的查询,而且还会导致重置UI,方法是将用户带回第一个项目(即远离他们在旋转设备之前查看的项目)。
我尝试在setRetainInstance(true)
类的getItem()
方法返回的片段上调用ScreenSlidePagerAdapter
,但它没有帮助。
有一个类似的问题here,但我期待/希望有更好的解决方案?
答案 0 :(得分:0)
在this article(特别是this part)的帮助下,我找到了解决方案。
首先,我没有打过电话......
getLoaderManager().initLoader(MY_LOADER_ID, null, this);
...在我的活动onCreate
方法中。但是如果我打电话给我,我只能达到正确的行为......
getLoaderManager().restartLoader(MY_LOADER_ID, args, this);
...仅在第一次时间运行活动。这是阻止执行新查询的唯一方法。
所以,这是我的活动的onCreate
方法的片段(我在创建ViewPager
和ScreenSlidePagerAdapter
之后立即放置...)
getLoaderManager().initLoader(LOADER_ID_NORMAL, null, this);
boolean isFirstCreate = (savedInstanceState == null);
if (isFirstCreate) {
/*
* If this Activity was launched with a search intent, then perform the search
*/
parseIntent(getIntent()); //calls getLoaderManager().restartLoader()
}
else {
/*
* Hide the progress view
*/
searchProgressBar.setVisibility(View.INVISIBLE);
}
适合我,似乎是一个相当干净的解决方案 - 但任何其他建议表示赞赏。
更新:2015年8月2日
根据我的评论,我认为这是正确的做法:
if (getLoaderManager().getLoader(LOADER_ID_NORMAL) == null) {
/*
* Loader doesn't exist, so create and start it
*/
Bundle args = ...;
getLoaderManager().restartLoader(LOADER_ID_NORMAL, args, this); //calls onCreateLoader()
}
else {
/*
* Loader already exists so all we need to do is initialise it
*/
getLoaderManager().initLoader(LOADER_ID_NORMAL, null, this); //calls onCreateLoader()
}