Android - 如何防止ViewPager的Loader重新启动配置更改?

时间:2014-12-27 02:44:53

标签: android android-fragments android-viewpager android-configchanges

我已按照these steps创建了ViewPager,但我遇到的问题是,当设备配置发生变化(例如设备轮换)时,重新启动加载程序。

这不仅会导致不必要的查询,而且还会导致重置UI,方法是将用户带回第一个项目(即远离他们在旋转设备之前查看的项目)。

我尝试在setRetainInstance(true)类的getItem()方法返回的片段上调用ScreenSlidePagerAdapter,但它没有帮助。

有一个类似的问题here,但我期待/希望有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

this article(特别是this part)的帮助下,我找到了解决方案。

首先,我没有打过电话......

getLoaderManager().initLoader(MY_LOADER_ID, null, this);

...在我的活动onCreate方法中。但是如果我打电话给我,我只能达到正确的行为......

getLoaderManager().restartLoader(MY_LOADER_ID, args, this);

...仅在第一次时间运行活动。这是阻止执行新查询的唯一方法。

所以,这是我的活动的onCreate方法的片段(我在创建ViewPagerScreenSlidePagerAdapter之后立即放置...)

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()
}