2012-05-05 9 views
1

トピックの状態として、私はフラグメントとアクションバーを使ってスワイプ可能なタブを実装しようとしています。私は、TabsAdapterクラス(FragmentPageAdapterのサブクラス)を使用して、ActionBarSherlockとサンプルのコードを使用して正常に実装しました。フラグメントの中には、同じタブのsporに新しいタブを表示できるものがあります。ここで問題が発生します。私は本当にページャの断片を新しいものに置き換える方法を考え出すことができません。私はグーグルで多くのものを試しました。スワイプルと置換可能なタブ、フラグメントとアクションバー

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

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

P.S.私のコードを見たいのですが、基本的には例と同じですが、問題はより一般的です。

答えて

0

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

私はあなたのところに似たような投稿に答えました。ここにある断片を削除しました。あなたの場合は、これを拡張して、別のものを削除してから追加します。

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

基本的に、あなたはPagerAdapter.POSITION_NONEを返し、あなたはそれを変更したいとき、あなたのアダプタの.notifyDataSetChanged();を呼び出すことを確認するgetItemPositionメソッドをオーバーライドし、FragmentStatePagerAdapterを使用する必要があります。

上記のリンクに対する答えは、これをより詳細に説明し、コード例を示しています。

+0

おかげで、私はそれを試してみたのだが、動作します! しかし、FragmentStatePagerAdapterを使用すると、フラグメントがスイッチ/スワイプするたびにリロードされたり、メモリに残っていてnotifyDataSetChangedが呼び出されたときにリロードされたりすることを意味しますか? – user1293081

+0

あなたがスワイプするたびに 'FragmentStatePagerAdapter'がアンロード/ロードされます。これは 'Fragment'関連の' 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

私は同じ質問としてそれを実際には見ませんでした。最初の質問は解決策を求めて、2番目は解決策です(これについて私はいくつかの回答を希望します)。 – user1293081

関連する問題