2012-05-05 91 views
1

作爲主題狀態,我試圖使用Fragments和ActionBar實現可滑動的選項卡。我已經成功地使用ActionBarSherlock和TabsAdapter類(FragmentPageAdapter的子類)的示例代碼實現了它。某些片段應該能夠在同一個選項卡spor中顯示新選項卡,這就是問題出現的地方。我真的無法弄清楚如何用新的替換尋呼機中的片段。我用Google搜索了很多東西。可移動和可替換的選項卡,碎片和ActionBar

我可以在內部集合中替換片段,並在FragmentPageAdapter中保存片段類,從而使得新的片段可用於getItem方法,但不會執行此操作,因爲我無法弄清楚如何更新尋呼機展示新的片段。即使在切換到另一個Tab並返回後,我仍然會得到舊的片段,我認爲這是由尋呼機緩存的地方。那麼有沒有辦法通知尋呼機的更新?

也許我應該忘記使用FragmentPageAdapter?在那種情況下,獲得所有這些功能的正確方法是什麼?

P.S.如果你想看到我的代碼讓我知道,但它基本上與示例中一樣,問題更一般,我認爲

回答

0

當您使用ViewPager時,除了頁面之外,它還在內存中保留可見頁面/片段/您可以導航到的片段。除此之外,如果ViewPager正在使用FragmentPagerApdapter,它會保留內存中的活動視圖。

我回答了上面類似的帖子,刪除了可以在這裏找到的片段。你的情況是這個的擴展,刪除然後添加其他東西。

https://stackoverflow.com/a/10399127/629555

基本上,你需要使用一個FragmentStatePagerAdapter,覆蓋getItemPosition方法返回PagerAdapter.POSITION_NONE,並確保您撥打.notifyDataSetChanged();你的適配器上,當你希望它改變。

上述鏈接的答案涵蓋了更詳細的內容,並提供了一個代碼示例。

+0

謝謝,我已經嘗試過了,它的作品! 但是使用FragmentStatePagerAdapter意味着碎片每次在它們之間切換/滑動時都會重新加載,或者它們仍然保留在內存中,並且在調用notifyDataSetChanged時重新加載? – user1293081

+0

每次刷卡時'FragmentStatePagerAdapter'都會卸載/加載。它是處理能力和內存之間的交換,與'Fragment' related'PagerAdapter'有關。 – Louth

+0

好吧,所以沒有辦法使用FragmentPageAdapter,只需手動強制重新加載?爲了使它更平滑,會這樣做。 – user1293081

0

如何使用FragmentStatePagerAdapter保持適配器中的片段的引用?然後我將它們都保存在內存中,但也完全控制了刪除。這種方法有什麼不好的地方,我以後會遇到問題嗎?此外,我已經改變,所以片段作爲對象而不是類傳遞,因此留在尋呼機之外。這有什麼問題嗎?

附上我的適配器代碼:

public static class TabsAdapter extends FragmentStatePagerAdapter implements 
ActionBar.TabListener, ViewPager.OnPageChangeListener { 
    private final Context mContext; 
    private final ActionBar mActionBar; 
    private final ViewPager mViewPager; 
    private final ArrayList<Fragment> mTabs = new ArrayList<Fragment>(); 


    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActionBar = activity.getSupportActionBar(); 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Fragment fragment) {   
     tab.setTag(fragment); 
     tab.setTabListener(this); 
     mTabs.add(fragment); 
     mActionBar.addTab(tab); 


     notifyDataSetChanged(); 
    }   

    public void replaceTab(ActionBar.Tab tab, Fragment fragment, int position) { 

     tab.setTag(fragment); 
     tab.setTabListener(this); 
     mTabs.set(position, fragment); 
     notifyDataSetChanged(); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return mTabs.get(position); 
    } 

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

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

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 

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

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

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

    @Override 
    public int getItemPosition(Object object){ 
     return PagerAdapter.POSITION_NONE; 
    } 
} 
+0

如果您要向問題添加新信息,則應該編輯問題,而不是添加新答案。 – BoltClock

+0

我沒有真正把它看作是同一個問題。第一個問題要求解決方案,第二個問題是解決方案(我希望得到一些答覆)。 – user1293081

相關問題