问题 ViewPager - 并不总是调用onCreateView


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


5920
2017-08-29 18:32


起源

发布代码以便我们了解正在发生的事情 - Paulo
您的ViewPager适配器可能会导致此问题。但是,如果没有看到你的代码我就无法知道...... - Oğuzhan Döngül
这个问题的任何适当解决方案? - Gibs


答案:


尝试扩展FragmentStatePagerAdapter


10
2018-04-07 05:40



哇 !这有用......弄清楚原因。谢谢 :) - Hamza Zaidi
应该接受答案,它对我来说很完美。谢谢。 :) - Naeem Ibrahim
是的,它有效,它应该是公认的答案。 - Hampel Előd


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

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

查看官方文档: http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html


2
2017-08-29 18:53



谢谢,但我添加了Log.i(“你好”,“你好”+ id); to getItem方法,这个日志我只看到我启动viewpager时。当我在页面之间滑动时,它不会调用。 - Bakus123
好的,尝试覆盖onResume方法。 - Fran b
onResume for Fragment还是FragmentPagerAdapter? - Bakus123
onResume for Fragment,或者如果你需要在OnCreate和OnResume中调用该代码,你可以编写一个单独的函数并从这两个方法中调用它。 - Fran b
我试过但它也不起作用:( - Bakus123


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

pager.setAdapter(adapter);

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

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


2
2018-03-12 00:20





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


1
2018-03-05 14:11





没有什么是错的。该 ViewPager 已有页面,因此不需要创建它。


0
2017-08-29 18:48



但我想更新页面...... - Bakus123
@ Bakus123:然后更新 现有页面。 - CommonsWare
当任何方法(onStart,OnCreate,onCreateView)没有插入时,我怎么能这样做? - Bakus123
@ Bakus123:一种可能性是添加一个 OnPageChangeListener 到了 ViewPager,所以你知道什么时候改变页面。或者,只需在数据发生变化时更新页面,而不是等待用户滑动到目前为止已创建的所有页面。 - CommonsWare
好的,但是如何在onPageScrolled方法中更新片段视图? - Bakus123


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...

0
2017-12-12 10:57