Android ViewPager-并不总是调用onCreateView
我有一个10页的可视寻呼机。当我开始最后一(10)页Android ViewPager-并不总是调用onCreateView,android,android-fragments,android-viewpager,android-pageradapter,Android,Android Fragments,Android Viewpager,Android Pageradapter,我有一个10页的可视寻呼机。当我开始最后一(10)页onCreateView()时,我的片段的方法被调用。当我滑动到第9页时,也会调用onCreateView()。但是当我回到第10页时,没有调用onCreateView()。出什么事了?没什么事。ViewPager已经有了页面,因此不需要创建它。这是因为FragmentPagerAdapter在内存中保存每个片段。因此,当您第一次访问片段时,将调用onCreate,但第二次Android将在内存中查找,因此不需要调用onCreate pager
onCreateView()
时,我的片段的方法被调用。当我滑动到第9页时,也会调用onCreateView()
。但是当我回到第10页时,没有调用onCreateView()
。出什么事了?没什么事。ViewPager
已经有了页面,因此不需要创建它。这是因为FragmentPagerAdapter在内存中保存每个片段。因此,当您第一次访问片段时,将调用onCreate,但第二次Android将在内存中查找,因此不需要调用onCreate
pager.setAdapter(adapter);
如果每次显示片段时都需要在OnCreate中运行代码,那么应该将其移动到getItem(int-id)
pager.setAdapter(adapter);
请参阅官方文档:您可以从onPageSelect调用适配器getItem,这在刷卡时也会调用,并将代码放在getItem中,甚至放在onPageSeelect本身中。我也遇到了同样的问题,我的解决方案是重新分配ViewPager实例的适配器,就像:
pager.setAdapter(adapter);
这将导致从viewPager重新启动“mItems”属性并删除缓存
pager.setAdapter(adapter);
但我不知道这是否是一个安全的解决方案CommonWare的答案是最好的,而且效果很好:
pager.setAdapter(adapter);
简单地将OnPageChangeListener
添加到ViewPager
项中,如下所示:
pager.setAdapter(adapter);
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...
请尝试扩展FragmentStatePagerAdapter发布代码,以了解ViewPager适配器上发生的情况可能导致此问题。但是我不能不看你的代码就知道…这个问题有什么合适的解决方案吗?谢谢,但是我添加了Log.i(“你好”,“你好”+id);我只在启动viewpager时看到这个日志。当我在页面之间滑动时,它不会调用。好的,尝试为Fragment或FragmentPagerAdapter覆盖onResume方法.onResume?为Fragment覆盖onResume?或者如果需要在OnCreate和onResume中调用该代码,您可以编写一个单独的函数并从这两个方法中调用它。当任何一个方法(onStart、OnCreate、onCreateView)出现时,我该怎么做inoke不是吗?@Bakus123:一种可能是在
ViewPager
中添加一个OnPageChangeListener
,这样你就能知道它何时更改页面。或者,只要在数据更改时更新页面,而不是等待用户刷到页面上,就可以对迄今为止创建的所有页面进行更新。@Bakus123:您需要跟踪存在哪些片段以及属于哪些位置。然后,你可以在你的片段上调用一些方法,告诉他们根据页面更改进行更新。这应该是可以接受的答案,它非常适合我。谢谢。:)是的,它是有效的,而且它确实应该是被接受的答案。@MehrdadSComputer当页面被选中时,片段被重新创建。所以onCreateView是called@Vinay当我们扩展FragmentPagerAdapter时,同样的情况不会发生?@MehrdadSComputer是的。使用FragmentPagerAdapter时会保存片段。当用户返回到前一个片段时,将显示从内存中提取而不是重新创建片段。
pager.setAdapter(adapter);