2012-11-16 51 views
1

onCreateView我在FragmentPagerAdapter中的第一個片段不是很快。 因此,將curent選項卡更改爲第一個會有延遲。如何禁用選項卡上的FragmentPagerAdapter中第一個片段的重新創建?

如何禁用在選項卡上的FragmentPagerAdapter中重新創建第一個片段?

private class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener { 
    private final Context context; 
    private ActionBar bar; 
    private final ViewPager viewPager; 
    private final ArrayList<TabInfo> tabs = new ArrayList<TabInfo>(); 

    final class TabInfo { 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(Class<?> _class, Bundle _args) { 
      clss = _class; 
      args = _args; 
     } 
    } 

    TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     context = activity; 
     bar = activity.getSupportActionBar(); 
     viewPager = pager; 
     viewPager.setAdapter(this); 
     viewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     tabs.add(info); 
     bar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     TabInfo info = tabs.get(position); 
     Fragment fragment = Fragment.instantiate(context, info.clss.getName(), info.args); 
     return fragment; 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 
    @Override 
    public void onPageScrollStateChanged(int state) {} 

    @Override 
    public void onPageSelected(int position) { 
     bar.setSelectedNavigationItem(position); 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
     Object tag = tab.getTag(); 
     for (int i = 0; i < tabs.size(); i++) { 
      if (tabs.get(i) == tag) 
       viewPager.setCurrentItem(i); 
     } 
    } 

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

回答

5

現在我堅持了同樣的問題。

當你在一個標籤:(N),只有標籤:(N-1)標籤:(N + 1)將在內存活,內存使用優化。休息所有標籤將被銷燬,這就是爲什麼當你回到第一個標籤時,它的onCreateView被再次調用。

其實標籤:1的即使你單擊標籤onCreateView將被稱爲:2,因爲它的鄰居選項卡。

一個解決方案,我得到的是:

變化OffscreenPageLimit的ViewPager的。它的默認值是

viewPager.setOffscreenPageLimit(total no of Tabs - 1); 

這樣,即使它的屏幕外所有的選項卡還活着。但這種建議只有當你有體面沒有標籤的(< = 5)

如果你有巨大的節數標籤,更好的使用

FragmentStatePagerAdapter

+0

酷! 非常感謝! – Sviatoslav

相關問題