Android ViewPager行为,它不会破坏旧片段

Android ViewPager行为,它不会破坏旧片段,android,android-intent,android-viewpager,Android,Android Intent,Android Viewpager,我想了解更多有关ViewPager行为的信息。我有一架FragmenPagerAdapter: public class DatePagerAdapter extends FragmentPagerAdapter { public DatePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(i

我想了解更多有关ViewPager行为的信息。我有一架FragmenPagerAdapter:

public class DatePagerAdapter extends FragmentPagerAdapter {

        public DatePagerAdapter(FragmentManager fm) {
            super(fm);
        }


        @Override
        public Fragment getItem(int position) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            int offset = position - 100;
            calendar.add(Calendar.MONTH, offset);
//            Toast.makeText(TestActivity.this,(calendar.get(Calendar.MONTH)+1)
            Log.v("CALENDAR", "" + position);
            TestFragmentDate date = TestFragmentDate.newInstance(TestActivity.this, calendar);
            return date;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            return super.instantiateItem(container, position);
        }
    }
以及我活动中的代码:

adapter = new DatePagerAdapter(getSupportFragmentManager());
        MinFragmentPagerAdapter wrapperMin = new MinFragmentPagerAdapter(getSupportFragmentManager());
        wrapperMin.setAdapter(adapter);
        PagerAdapter wrapper = new InfinitePagerAdapter(wrapperMin);
        viewPager = (ViewPager) this.findViewById(R.id.pager);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(100);
        viewPager.addOnPageChangeListener(this);
据我的前辈说,ViewPager总是画3个片段,并不断重复使用它们。例如,首先我在位置处有视图: 99, 100, 101 如果我掷对,它将摧毁99,创造102,依此类推。 但是,当我在函数
getItem
上调试时,它最初确实运行到这个函数中,但是当我向右滚动5或6页,然后再向后滚动时,它没有运行到
getItem
,应该被销毁的位置

有人能为我解释一下ViewPager的行为吗?谢谢。

谷歌指南上说:

FragmentPagerAdapter

此版本的寻呼机最适合在有少量用户的情况下使用 通常,需要分页的静态片段较多,例如一组 标签。用户访问的每个页面的片段将保留在其中 内存,尽管其视图层次结构在不可见时可能会被破坏。 这可能会导致使用大量内存,因为 实例可以保持任意数量的状态。对于较大的集合 在页面中,考虑FraceStasePeaServer适配器< < /P> 关于片段StatePageRadapter:

当有大量数据时,此版本的寻呼机更有用 页,更像列表视图。当页面对用户不可见时 用户,他们的整个片段可能会被销毁,只保留 保存该片段的状态。这使得寻呼机能够抓住更多的信息 与其他页面相比,与每个访问页面关联的内存更少 碎片PageRadapter的成本可能会更高 在页面之间切换

结论:在您的情况下使用
FragmentStatePageAdapter
,也就是说,您不希望
Fragment
附加到
ViewPager
上被销毁

您还可以使用
viewpager.setOffscreenPageLimit(),以限制空闲状态下屏幕外保留的页面数量。

如前所述:

您还可以使用
viewpager.setOffscreenPageLimit()
限制在空闲状态下屏幕外保留的页面数量

从官方文件:

setOffsetPageLimit()
:设置在空闲状态下应保留在视图层次结构中当前页面任一侧的页数。超出此限制的页面将在需要时从适配器重新创建


这意味着
setoffscreenpagilemit(1)
将保持1页面向左和/或1页面向右,这取决于你在viewPager的位置。

试试这个Ok我刚刚读过谷歌的指南。它说
setOffscreenPageLimit
的默认值是1。因此,如果我不设置某些特定的
限制
,则将保留2个页面,可见页面和1个屏幕外页面。但在我发布的代码中,首先运行它创建3个页面,1个可见页面,1个在左侧,1个在右侧。这让我很困惑。。。你能为我解释一下这种行为吗?谢谢,将
setOffscreenPageLimit
设置为1(默认值)。只有一个页面将保留在内存中,可以出现在当前页面的任一侧。如果您有3个页面/片段,并且希望保留所有页面/片段,则必须
将offscreenpagelimit
设置为2。我发誓它是1(默认设置)。当我调试时,它真的跳入
getItem
3次,位置是99100101。中间的是100我没有说默认值不是1,请澄清你的问题好的,让我澄清我的问题。我只是想知道为什么ViewPager及其适配器的行为方式出乎我的意料
setOffScreenPageLimit
默认为1。所以我想说,它第一次运行时,将创建2个页面,1个可见页面,1个屏幕外页面。这意味着它将在其适配器中运行两次
getItem
。这是我所期望的行为。但是,它运行了3次
getItem
,1次用于可见页面,1次用于左侧,1次用于右侧。所以我问它为什么会这样。