1

正如主题所述,我正在尝试使用 Fragments 和 ActionBar 实现可滑动的选项卡。我已经使用 ActionBarSherlock 和 TabsAdapter 类(FragmentPageAdapter 的子类)的示例中的代码成功地实现了它。一些片段应该能够在同一个标​​签spor中显示一个新标签,这就是问题出现的地方。我真的不知道如何用新的片段替换寻呼机中的片段。我用谷歌搜索并尝试了很多东西。

我可以替换在 FragmentPageAdapter 中保存片段类的内部集合中的片段,从而使新的片段可用于 getItem 方法,但这并没有这样做,因为我不知道如何更新寻呼机以显示新的分段。即使在切换到另一个选项卡并返回后,我仍然会得到旧的片段,我认为它正被寻呼机缓存在某处。那么有没有办法通知寻呼机的更新?

也许我应该忘记使用 FragmentPageAdapter ?在那种情况下,实现所有这些功能的正确方法是什么?

PS如果您想查看我的代码,请告诉我,但它与示例中的基本相同,而且我认为问题更普遍

4

2 回答 2

0

When you use a ViewPager it keeps the visible page/fragment in memory in addition to pages/fragments that you can navigate to. In addition to this, if the ViewPager is using a FragmentPagerApdapter it keeps the views in memory for the life of the activity.

I answered a similar post to yours above removing a fragment which can be found here. Your case is an extension of this, removing and then adding something else.

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

Basically, you need to use a FragmentStatePagerAdapter, override the getItemPosition method to return PagerAdapter.POSITION_NONE and make sure you call .notifyDataSetChanged(); on your adapter when you want it changed.

The answer to the link above covers this in much more detail and provides a code example.

于 2012-05-05T22:43:05.490 回答
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;
    }
}
于 2012-05-06T17:24:07.310 回答