ViewPager + FragmentStatePagerAdapter +方向更改

Inf*_*0re 11 android caching adapter fragment android-viewpager

我有一点问题:我有一些带有一些Pages的ViewPager,我使用FragmentStatePagerAdapter来处理数据.在肖像中,我有例如20页用于ViewPager,在景观中我只有10页用于ViewPager.因此,在方向更改时,我创建了一个具有不同数据的新适配器.

这里有一个小解释原因:我在肖像中展示一幅图像,在风景中展示两幅图像,但总是全部都在计算中 如果我要显示10张照片,我有10张照片,5张照片(总是两张).

但现在我有一个奇怪的错误:当我在索引5上的Landscape并转动设备时,ViewPager的当前页面设置为10.如果我再将它再次转回我在第5页.如果我现在将ViewPage刷到页面10从不调用适配器的methode getItem,并且ViewPage向我显示一个肖像图片而不是两个用于横向图片.怎么会发生这种情况?适配器或ViewPager中是否有缓存?在Activity的onCreate中,一切都是新创建的,适配器以及ViewPager的数据(只是带路径的字符串).所以任何想法如何解决这个真正可怕的"功能"?

这是一些代码:

的onCreate:

    mViewPagerAdapter = new ReaderPageViewAdapter(getSupportFragmentManager(), getBaseContext(), mCurrentDocument.mPages, getResources()
                .getConfiguration().orientation);
    mPageReader = (ReaderViewPager) findViewById(R.id.pager);
    mPageReader.setAdapter(mViewPagerAdapter);
Run Code Online (Sandbox Code Playgroud)

adapter getItem:

    public Fragment getItem(final int index) {
        final PageInfo pageInfo = mPages.get(index);
        final PageFragment pageFragment = (PageFragment) PageFragment
                .instantiate(mContext, pageInfo.mClss.getName(), pageInfo.mArgs);
        return pageFragment;
    }
Run Code Online (Sandbox Code Playgroud)

如果你需要更多东西,请告诉我.谢谢

Inf*_*0re 41

您可以覆盖FragmentActivity onSaveInstanceState()而不调用方法中的super.onSaveInstanceState().

@Override
protected void onSaveInstanceState(final Bundle outState) {
    // super.onSaveInstanceState(outState);
}
Run Code Online (Sandbox Code Playgroud)

不使用 mViewPager.setSaveEnabled(false);

它结束了一个很大的记忆泄漏.每次更改方向后,它都会将Fragments放入FragmentManager数组中,并且永远不会清除它.因此,多次更改方向后,内存使用量将超过100mb.使用onSaveInstanceState方法是我认为更好的方法.