簡體   English   中英

可滑動和可替換的選項卡,片段和ActionBar

[英]Swipable and replacable tabs, Fragments and ActionBar

正如主題所述,我正在嘗試使用Fragments和ActionBar實現可滑動選項卡。 我已經使用ActionBarSherlock和來自帶有TabsAdapter類(FragmentPageAdapter的子類)的示例中的代碼成功實現了它。 某些片段應該能夠在同一選項卡中顯示一個新的選項卡,這就是問題所在。 我真的不知道如何用新的替換尋呼機中的一個片段。 我用谷歌搜索並嘗試了很多東西。

我可以替換包含FragmentPageAdapter內的fragments類的內部集合中的fragment,從而使新的Fragment可用於getItem方法,但這不能實現,因為我不知道如何更新尋呼機以顯示新的分段。 即使切換到另一個Tab並返回后,我仍然會得到舊的Fragment,我認為它是由尋呼機緩存在某個地方的。 那么有沒有辦法通知尋呼機更新呢?

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

PS:如果您想查看我的代碼,請告訴我,但是它與示例中的代碼基本相同,並且我認為問題更籠統

使用ViewPager時,除了可以瀏覽的頁面/片段外,它ViewPager可見的頁面/片段保留在內存中。 除此之外,如果ViewPager使用FragmentPagerApdapter它將在活動期間將視圖保留在內存中。

我回答了與您上面類似的帖子,刪除了可以在此處找到的片段。 您的案例是對此的擴展,刪除然后添加其他內容。

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

基本上,您需要使用FragmentStatePagerAdapter ,重寫getItemPosition方法以返回PagerAdapter.POSITION_NONE並確保您調用.notifyDataSetChanged(); 在適配器上更改時。

上面鏈接的答案對此進行了更詳細的介紹,並提供了代碼示例。

如何使用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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM