在FragmentStatePagerAdapter中重用片段

时间:2016-03-20 16:47:37

标签: android

我的问题
我正在创建一个Android应用程序,用户可以通过一堆卡片(如火种)轻扫 每张卡都非常重(有谷歌地图视图和admob广告) 我尝试将列表加载到片段适配器中。这意味着每个项目的片段。这是非常耗费内存的,因为我为30个项目创建了大约30个谷歌地图视图和30个浏览视图 我的关系5毫不奇怪地在这种不必要的重负荷下崩溃。

我的尝试解决方案
我创建了3个片段实例。将这些片段加载到HashMap中。

//用于当前显示的片段 key = 0

//用于上一页 key = -1

下一页 key = 1

我保留了以前的索引 在适配器的getItem方法中,我检测用户是否已转到上一页或下一页 我得到相关的片段并将其返回。

我的问题是我一直收到如下例外:
IllegalStateException:已添加片段

我试过分离和/或删除片段但没有运气:(

有什么建议吗? 感谢

2 个答案:

答案 0 :(得分:0)

来自Google Play ViewPager示例...

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return new ScreenSlidePageFragment();
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }
}

在getItem(int位置)中,您必须创建一个新的Fragment实例,当达到setOffscreenLimit时,应该销毁旧的片段。我觉得你最初一次创造了所有30个片段的感觉?

答案 1 :(得分:0)

查看android的有效导航示例,以正确使用fragmentstatepageradapter。 http://developer.android.com/shareables/training/EffectiveNavigation.zip

我建议将你的admob放在viewpager下面的主要活动中。所以你不需要每次都重启它。谷歌不建议使用滑动视图中的谷歌地图,因为它很难处理滑动和地图缩放功能。因此,只需使用静态地图api,它会根据您提供的坐标提供地图的屏幕截图,并实现onclick方法以将地图作为另一项活动启动。