ViewPager - 并不总是调用onCreateView

时间:2014-08-29 18:32:56

标签: android android-fragments android-viewpager android-pageradapter

我有一个包含10页的ViewPager。当我开始调用我的片段的最后一个(第10个)页onCreateView()方法时。当我滑到第9页时,onCreateView()也会被调用。但是当我回到第10页时onCreateView()没有被调用。怎么了?

6 个答案:

答案 0 :(得分:14)

尝试扩展FragmentStatePagerAdapter

答案 1 :(得分:2)

这是因为FragmentPagerAdapter会在每个片段中保留内存。因此,当您第一次访问片段时,将调用onCreate,但Android将在内存中第二次查找,因此不需要调用onCreate。

如果您需要在每次显示片段时运行OnCreate中的代码,您应该将其移动到getItem(int id)

请参阅官方文档:http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html

答案 2 :(得分:2)

我有同样的问题,我的解决方案是再次分配ViewPager实例的适配器,就像:

pager.setAdapter(adapter);

这会导致从viewPager重新启动“mItems”属性并删除缓存。

但我不知道这是否是一个安全的解决方案

答案 3 :(得分:1)

没有错。 ViewPager已经有了页面,因此无需创建它。

答案 4 :(得分:1)

您可以从onPageSelect调用适配器getItem,也可以在swipes上调用,并将代码放在getItem中,甚至放在onPageSeelect本身中。

答案 5 :(得分:0)

CommonWare的答案是最好的,并且像魅力一样: 简单地将OnPageChangeListener添加到您的ViewPager项目,如下所示:

ViewPager     viewPager    = null;
PagerAdapter  pagerAdapter = null;

//Some code come here...

pagerAdapter = new PagerAdapter(); //Or any class derived from it
viewPager    = (ViewPager)findViewById(R.id.container);//Connect it to XML
viewPager.setAdapter (mPagerAdapter); //Connect the two

//Next two lines are simply for fun...
//viewager.setPageTransformer(true, new DepthPageTransformer());
//viewPager.setPageTransformer(true, new PaymentZoomOutPageTransformer());

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }
        //This is the right place to connect the pages with a data struct!!!
        @Override
        public void onPageSelected(int position) {
            // Here you can connect the current displayed page with some data..
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

 //Here use the inflater to add views/pages
 //Don't forget to do:
 pagerAdapter.notifyDataSetChanged();
 //When you're done...