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

时间:2015-12-02 10:05:32

标签: android android-intent android-viewpager

我想了解有关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的行为吗?谢谢。

2 个答案:

答案 0 :(得分:6)

Google的指南说:

<强> FragmentPagerAdapter

  

此版本的寻呼机最适合在少数人使用时使用   通常会有更多静态片段被分页,例如一组   标签。用户访问的每个页面的片段将保留在其中   内存,虽然它的视图层次结构可能在不可见时被销毁。   这可能导致自片段以来使用大量内存   实例可以保持任意数量的状态。对于较大的集合   的页面,请考虑FragmentStatePagerAdapter。

关于 FragmentStatePagerAdapter:

  

当有大量的寻呼机时,此版本的寻呼机更有用   页面,更像列表视图。当页面不可见时   用户,他们的整个片段可能会被破坏,只保留   保存了该片段的状态。这允许寻呼机保持很多   与每个访问页面相关联的内存较少   FragmentPagerAdapter的代价可能是更多的开销   在页面之间切换。

结论:在您的案例中使用FragmentStatePageAdapter,即您不希望Fragment附加到您的ViewPager被销毁。

您还可以使用viewpager.setOffscreenPageLimit(<no of fragments>);来限制在空闲状态下屏幕外的页数。

答案 1 :(得分:0)

如前所述:

您也可以使用viewpager.setOffscreenPageLimit(<no of fragments>); 限制在空闲状态下将有多少页面保持在屏幕外。

摘自官方文档:

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

这意味着setOffScreenPageLimit(1)会将 1 页面保留在左侧和/或 1 页面的右侧,具体取决于位置是您的viewPager。