2011-09-16 57 views
23

我使用的是ViewPager另一个片段替换片段与FragmentPagerAdapter举办三种不同的片段里面ViewPager

[Fragment1][Fragment2][Fragment3] 

我试图做到的,是用一个全新的片段成功替代片段1在一起,片段4,如果一个特定的任务成功。

当我使用..

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.replace(R.id.fragment1_layout_id, fragment4); 
transaction.commit(); 

..the片段精美替换和Fragment4示出,而不是片段1。尽管只要我一直向Fragment3滑动,然后再回到Fragment4,Fragment1已经卷土重来。

再说,如果我用..

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.remove(fragment1); 
transaction.commit(); 

..Fragment1被删除,我回来的时候Fragment4是存在的。因此,这种解决方案的问题是,我无法找到一个方法来立即显示Fragment4为片段1被删除,即使我想:

transaction.add(fragment4); 
transaction.show(fragment4); 

这是我的FragmentPagerAdapter实现看起来像此刻,无任何交易管理

public static class PagerAdapter extends FragmentPagerAdapter { 

    public PagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return VIEW_COUNT; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     Fragment fragment = null; 

     switch (position) { 
     case 0: 
      fragment = Fragment1.newInstance(context_); 
      break; 

     case 1: 
      fragment = Fragment2.newInstance(context_); 
      break; 

     case 2: 
      fragment = Fragment3.newInstance(context_); 
      break; 

     default: 
      break; 
     } 

     return fragment; 
    } 
} 

编辑。

所以看来我并不完全清楚我的问题。我决定删除我之前设法创建的所有意大利面条,并试图说明我已将它们关闭(参见上面的粗体文字)。

反正这里有差不多就是我一直在努力中的getItem()做:

@Override 
public Fragment getItem(int position) { 

    Fragment fragment = null; 

    switch (position) { 
    case 0: 

     if (!app.isUserLoggedIn) { 
      if (loginFragment_ == null) { 
       loginFragment_ = LoginFragment.newInstance(context_); 
       transaction_ = fragmentManager_.beginTransaction(); 

       if (logoutFragment_ != null) { 
        transaction_.remove(logoutFragment_); 
        logoutFragment_ = null; 
       } 

       transaction_.add(loginFragment_, "login"); 
       transaction_.commit(); 
      } 

      if (fragmentManager_.findFragmentByTag("login") == null) 
       fragment = LoginFragment.newInstance(context_); 
      else 
       fragment = fragmentManager_.findFragmentByTag("login"); 

     } else { 
      if (logoutFragment_ == null) {      
       logoutFragment_ = LogoutFragment.newInstance(context_); 
       transaction_ = fragmentManager_.beginTransaction(); 

       if (loginFragment_ != null) { 
        transaction_.remove(loginFragment_); 
        loginFragment_ = null; 
       } 

       transaction_.add(logoutFragment_, "logout"); 
       transaction_.commit(); 
      } 

      if (fragmentManager_.findFragmentByTag("logout") == null) 
       fragment = LogoutFragment.newInstance(context_); 
      else 
       fragment = fragmentManager_.findFragmentByTag("logout"); 
     } 
     break; 

    case 1: 
     fragment = HomeFragment.newInstance(context_); 
     break; 

    case 2: 
     fragment = RegisterFragment.newInstance(context_); 
     break; 

    default: 
     break; 
    } 

    return fragment; 
} 

有了这个代码,我什么也没有做,但如果有人看到我在做什么错了,想点我在正确的方向,我会很感激!

+0

我认为你应该在PagerAdapter中改变getItem。有返回的片段必须可见。 – pawelzieba

+0

@dziobas这就是我一直试图去做我在我的问题中描述的魔力的地方,没有运气。 – velu

+0

fragment2被调用时,我点击tab1,我不知道为什么tab2被称为?是适配器错误? –

回答

10

尝试使用FragmentStatePagerAdapter

http://android-developers.blogspot.com/2011_08_01_archive.html

堂妹为通过视图刷卡它会删除片段(也当你调用getItem),这样你就不需要自己明确地删除它们。

我一直有同样的问题,它适用于我。

我尝试你的代码并删除if (fragment!=null)块,它的工作原理。

+0

你可以显示一些代码plz。我会非常感激,因为我遵循你的步骤,我没有得到我想要的... – cesards

0

在某些情况下,您的getItem声明是否应该返回的fragment4?

+0

是的,它应该和我一直在试图找出正确的方法来做这一整天。我更新了我的问题,并补充说明迄今为止我一直在努力做到这一点。 – velu

0

嘿我已经解决了这个问题,通过使用我的FragmentPagerAdapter中的列表来处理各种片段,然后我的getItem就像这样....

public void addScreen(String tag, Class<?> clss, Bundle args){ 
     if(clss!=null){ 
      TabInfo info = new TabInfo(tag, clss, args); 
      screens.add(info); 
     } 
    } 
@Override 
    public Fragment getItem(int position) { 
     TabInfo info = screens.get(position); 
     return Fragment.instantiate(context, info.clss.getName(), info.args); 
    } 

我再编程方式删除/添加/重新排列列表项(片段),然后在处理程序调用

mAdapter.notifyDataSetChanged() 
3

像Maurycy说,你需要调用mAdapter.notifyDataSetChanged(),每当你想告诉ViewPager说碎片已被替换。但是,您还需要覆盖适配器中的getItemPosition()抽象函数,并在使用旧的隐藏片段作为参数调用时返回POSITION_NONE。否则,ViewPager将保留所有当前片段。

有关更多信息和示例代码,请参阅this answerrelated question

0

有关如何使用ViewPagerFragmentPagerAdapter插入/替换制表符的类似问题,请参阅我的answer

0

尝试将offScreenPageLimit设置为5(或基于您的用例)以避免重新加载片段,以便您替换的内容将保留,而不是在滑动时重新加载。

mViewPager.setOffscreenPageLimit(5); 
相关问题