2012-11-26 28 views
7

まず、FragmentStatePagerAdapterを使用して、表示するフラグメントをViewPagerに供給しています。setAdapterが呼び出されたときにViewPagerが常に更新されるとは限りません.FragmentStatePagerAdapter

アプリが実行中の場合(つまりonResume()以降)、ViewPagerでsetAdapterを呼び出すと、常にViewPagerが更新され、アダプタのgetItem(int position)メソッドが呼び出されます。

オリエンテーションを変更した後、私の活動のonCreate(Bundle savedInstance)メソッドでsetAdapterを呼び出すと、getItem(int position)メソッドが呼び出されず、古いフラグメントが再利用されます。

私がFragmentManagerが私が理解していないことをしているのかもしれないと思っていますか?方向変更中に破棄されないのは、フラグメントマネージャだけです。

おかげ

+0

問題はSavedStateです。私は同じ問題を抱えていますが、解決策はありません。次のように試すことができます:アダプタコールアダプタを設定します。saveStateを使用して、アダプタを設定して、restoreSavedStateを保存された状態で呼び出します。私の場合、それは助けにはならなかったが、おそらくあなたのために。理由:ViewPagerのsetAdapterで、現在の状態を保存して再利用しました。 (私は思う) – Informatic0re

+1

ここで正解を見つける:http://stackoverflow.com/questions/13910826/viewpager-fragmentstatepageradapter-orientation-change – Informatic0re

+0

これはメモリリークの原因ですか?多くの人がそれを言っている。このシナリオをどのように扱うのか他の解決策はありますか? – pradyumnad

答えて

21

ネストされた断片を使用しているときにFragmentStatePagerAdapterをインスタンス化するgetFragmentManager()を使用しているので、それは可能性があります。

ではなくgetChildFragmentManager()を使用してみてください:

CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager()); 

回答をhereが判明しました。

+0

私のために働いた.... – Ganesh

+0

それは非常に有用な情報でした! –

+0

お世話になりました..! –

1

これは私が知ったことです(非常に奇妙です)。

あなたはリフレッシュにPagerAdapterのアイテムが必要な場合は、あなたが最も確かにそう例えば、あなたが同じFragmentManagerを通過しないときPageAdapterの新しいインスタンスを作成し、ViewPagersetAdapterコールに渡すんに失敗します:

FragmentManager fm = getChildFragmentManager(); 
mViewPager.setAdapter(new MyPagerAdapter(fm)); 

または

FragmentManager fm = getActivity().getSupportFragmentManager(); 
mViewPager.setAdapter(new MyPagerAdapter(fm)); 

しかし、あなたは常にFragmentManager秒を切り替えます場合は、iniファイルですそれはうまくいくでしょう。PagerAdapter

私の視点から、それは誰もが(この汚いやり方ではない)適切ViewPager内の項目を更新する方法についてのアイデアを持っている場合は、他の人と意見を共有してみてください...恐ろしいです:)

0

私はFragmentPagerAdapterを使用mViewPager.setAdapter()は動作しません。私は以下のステップでそれを修正します:
(1)現在のフラグメントリストを取得します。

List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
List<Fragment> fragmentListCopy = new ArrayList<Fragment>(fragmentList); 

(2)

mamually

//I have two fragment 
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(0)).commit(); 
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(1)).commit(); 
をフラグメントを削除する(3)新しいアダプタを設定する前だけで断片を除去ViewPager

mViewPager.setAdapter(...) 

に新しいFragmentPagerAdapterを設定します。

関連する問題