2014-07-22 68 views
8

我有3个片段......带有3个导航选项卡。我不想刷新更改片段

问题是,如果我在第一个选项卡上,我点击第三个..当我点击另一个时间第一个,它重新加载所有的片段。如果我点击第二个标签(在中间),然后点击第一个标签,它不会重新加载。

我的目标是我不想永远刷新我的片段!

我该怎么办?

我的代码是:

public class TabsPagerAdapter extends FragmentPagerAdapter { 

    public TabsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 
// Return Items 
    @Override 
    public Fragment getItem(int index) { 

     switch (index) { 
     case 0: 
      return new Retos(); 
     case 1: 
      return new Amics(); 
     case 2: 
      return new Ranking(); 
     } 

     return null; 
    } 

    @Override 
    public int getCount() { 
     // get item count - equal to number of tabs 
     return 3; 
    } 

} 

这:

public class Perfil extends ActionBarActivity implements ActionBar.TabListener{ 

private ViewPager viewPager; 
private TabsPagerAdapter mAdapter; 
private ActionBar actionBar; 
private SearchView mSearchView; 
private TextView mStatusView; 
// Tab titles 
private String[] tabs = { "TAB1", "TAB2", "TAB3" }; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.perfil); 


    // Initilization 
    viewPager = (ViewPager) findViewById(R.id.pager); 
    actionBar = getSupportActionBar(); 
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

    viewPager.setAdapter(mAdapter); 
    actionBar.setHomeButtonEnabled(true); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  


    /** Creating fragment1 Tab */ 
    Tab tab = actionBar.newTab() 
     .setText("TAB1") 
     .setTabListener(this); 

    actionBar.addTab(tab); 

    /** Creating fragment2 Tab */ 
    tab = actionBar.newTab() 
     .setText("TAB2") 
     .setTabListener(this); 
     //.setIcon(R.drawable.ic_action_group); 

    actionBar.addTab(tab); 

    /** Creating fragment3 Tab */ 
    tab = actionBar.newTab() 
     .setText("TAB3") 
     .setTabListener(this); 

    actionBar.addTab(tab); 




    /** 
    * on swiping the viewpager make respective tab selected 
    * */ 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) { 
      // on changing the page 
      // make respected tab selected 
      actionBar.setSelectedNavigationItem(position); 

     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
} 


@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    // on tab selected 
    // show respected fragment view 
    viewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
} 

}

回答

23
viewPager.setOffscreenPageLimit(C_FRAGMENTS_TO_KEEP_IN_MEMORY); 

C_FRAGMENTS_TO_KEEP_IN_MEMORY是在右突片的数量和左当前所选的选项卡的保持在存储器中。所以在你的情况应该是2.

请确保你没有创建一个新的片段实例,每次你调用viewpager适配器中的getItem方法。

查看此页面中的@Rarw答案。

+0

它不适用于我:(我尝试添加viewPager.setOffscreenPageLimit(2);和viewPager.setOffscreenPageLimit(3);但它每次都会重新加载 –

+0

@JaumeColomFerrer显示代码 – Sotti

+0

最后,它的作品!!!非常感谢你:D –

1

尝试设置你的ViewPager offScreenPageLimit覆盖你要加载碎片的数量。 OffScreenPageLimist在片段不可见时使片段保持空闲状态。我没有看到代码中设置的值,并且基于您描述的内容,这些碎片会继续回收,这听起来像您使用的默认状态为1,这将只保留屏幕之外的碎片之一而不是两者。

有些注意事项,如果您事先知道需要多少片段,那么这种方法才有效,因为如果您动态地添加和删除片段,很难知道要保留多少片段。

UPDATE

为什么你的网页都令人耳目一新这很可能是:

@Override 
public Fragment getItem(int index) { 

    switch (index) { 
    case 0: 
     return new Retos(); 
    case 1: 
     return new Amics(); 
    case 2: 
     return new Ranking(); 
    } 

    return null; 
} 

你回头率每次开机时间ID一个新片段。你应该这样做:

case 0: 
    if(mRetrosFragment == null) 
      mRetrosFragment = new Retros(); 
    return mRetrosFragment; 

这样你停止重新创建片段,每次标签更改,而是保留该实例。

+0

它不适用于我:(我试图添加viewPager.setOffscreenPageLimit(2);和viewPager.setOffscreenPageLimit(3);但它每次都会重新加载 –

+0

我想我想通了尝试新的解决方案 – Rarw

+0

休息是在这种情况下没有必要 – Sotti