1

トピックにあるように、FragmentsとActionBarを使用してスワイプ可能なタブを実装しようとしています。ActionBarSherlockと、TabsAdapterクラス(FragmentPageAdapterのサブクラス)の例のコードを使用して、正常に実装しました。一部のフラグメントは、同じタブスポアに新しいタブを表示できるはずです。ここで、問題が発生します。ページャーのフラグメントを新しいフラグメントに置き換える方法が本当にわかりません。私はグーグルでたくさんのことを試しました。

FragmentPageAdapter内のフラグメントクラスを保持している内部コレクションのフラグメントを置き換えることができます。これにより、新しいフラグメントをgetItemメソッドで使用できるようになりますが、ページャーを更新して新しいものを表示する方法がわからないため、これはできません。断片。別のタブに切り替えて戻った後でも、ページャーによってどこかにキャッシュされていると思われる古いフラグメントが表示されます。では、ポケットベルに更新を通知する方法はありますか?

たぶん私はFragmentPageAdapterの使用を忘れるべきですか?その場合、このすべての機能を実現するための正しい方法は何ですか?

PS私のコードを見たい場合は私に知らせてください、しかしそれは基本的に例と同じであり、問​​題はより一般的だと思います

4

2 に答える 2

0

を使用するViewPagerと、移動可能なページ/フラグメントに加えて、表示されているページ/フラグメントがメモリに保持されます。これに加えて、ViewPagerがを使用している場合FragmentPagerApdapterは、アクティビティの存続期間中、ビューをメモリに保持します。

ここにあるフラグメントを削除して、上記のあなたと同様の投稿に回答しました。あなたのケースはこれを拡張したものであり、何か他のものを削除してから追加します。

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

基本的に、を使用しFragmentStatePagerAdapter、メソッドをオーバーライドしgetItemPositionて戻り、変更するときにアダプターPagerAdapter.POSITION_NONEを呼び出す必要があります。.notifyDataSetChanged();

上記のリンクへの回答は、これをより詳細にカバーし、コード例を提供します。

于 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 に答える