0

我正在开发一个Android应用程序,其中我的MainActivity中有一个ViewPager,由3个片段组成。 问题如下,当我滑动到第三个片段,并返回到第一个,片段1的onCreateView被调用,这是我真正想要的,但是,如果我只是甩到第二个片段,并返回到第一个,onCreateView不叫! 我需要找到解决这个问题的办法,我花了几个小时试图找到一个解决方案,但不知道解决它。 下面是我的MainActivity相关ViewPager代码使用ViewPager时不会调用CreateView上的片段使用ViewPager

private void setupViewPager(final ViewPager viewPager) { 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFrag(new voting(), "ONE"); 
    adapter.addFrag(new dashboard(), "TWO"); 
    adapter.addFrag(new chats(), "THREE"); 
    myAdapter=adapter; 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(0); 
} 

private class ViewPagerAdapter extends FragmentStatePagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<Fragment>(); 
    private final List<String> mFragmentTitleList = new ArrayList<String>(); 

    private ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Log.i("getItem","getItem"); 
     return mFragmentList.get(position); 
    } 


    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    private void addFrag(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    //added newly 
    @Override 
    public int getItemPosition(Object object){ 
     return PagerAdapter.POSITION_NONE; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return null; 
    } 
} 
+0

“如果我只转到第二个片段并返回到第一个片段,onCreateView不会被调用” - 如果您的意思是onCreateView()没有在第一个片段上再次调用,那是非常正常的。 “我需要找到解决这个问题的办法” - 你为什么认为这是一个问题? – CommonsWare

+0

@CommonsWare是的,这就是我的意思,但没有找到解决方案 –

回答

1

这是为了与FragmentPagerAdapter行为。如果片段已经被创建并且仍然在内存中,它将重新连接到ViewPager。因此,onCreateView(...)之所以不被称为第二次。

实现PagerAdapter,将每个页面表示为片段,只要用户可以返回页面,该片段就永久保存在片段管理器中。

您使用的FragmentStatePagerAdapterFragmentPagerAdapter的子类,因此它会继承此行为。

通常,在每次页面更改时重新创建视图并不是一个好主意,因为这样很昂贵并且可能导致不平滑的滚动。如果您在onCreateView(...)中有一些逻辑需要在每个片段更改时再次运行,那么我建议您查看ViewPager.OnPageChangedListener

+0

如果我的逻辑与onCreateView和ViewGroup中的inflater有什么关系,那该怎么办?我怎么能从mainActivity执行这个逻辑? –

+1

使用inflater创建视图,并在片段中保存对这些视图的引用以便稍后与其交互。除非你是由于某种原因动态创建视图,否则你不应该在'onCreateView(...)'之后需要一个充气器。 更新您的问题与您的inflater用例,也许我们可以建议一个更好的模式:) – Jon

相关问题