10ページのViewPagerがあります。最後(10番目)のページを開始すると、フラグメントのonCreateView()
メソッドが呼び出されます。 9ページ目にスワイプすると、onCreateView()
も呼び出されます。しかし、10ページ目に戻ると、onCreateView()
は呼び出されません。どうしましたか?
FragmentStatePagerAdapterを拡張してみてください
これは、FragmentPagerAdapterがすべてのフラグメントをメモリに保持するためです。したがって、最初にフラグメントにアクセスすると、onCreateが呼び出されますが、2回目はAndroidがメモリ内を検索するため、onCreateを呼び出す必要はありません。
フラグメントが表示されるたびにOnCreateでコードを実行する必要がある場合は、コードをgetItem(int id)に移動する必要があります。
公式ドキュメントを参照してください: http://developer.Android.com/reference/Android/support/v4/app/FragmentPagerAdapter.html
同じ問題が発生しました。解決策は、次のように、ViewPagerインスタンスのアダプターを再度割り当てることでした。
pager.setAdapter(adapter);
これにより、viewPagerから「mItems」プロパティが再起動され、キャッシュが削除されます。
しかし、それが安全な解決策かどうかはわかりません
何も悪いことはありません。 ViewPager
にはすでにページがあるため、ページを作成する必要はありません。
スワイプでも呼び出されるonPageSelectからアダプターgetItemを呼び出し、コードをgetItem内、またはonPageSeelect自体に配置できます。
CommonWareの答えは最良であり、魅力のように機能します。OnPageChangeListener
アイテムにViewPager
を追加するだけで、次のようになります。
ViewPager viewPager = null;
PagerAdapter pagerAdapter = null;
//Some code come here...
pagerAdapter = new PagerAdapter(); //Or any class derived from it
viewPager = (ViewPager)findViewById(R.id.container);//Connect it to XML
viewPager.setAdapter (mPagerAdapter); //Connect the two
//Next two lines are simply for fun...
//viewager.setPageTransformer(true, new DepthPageTransformer());
//viewPager.setPageTransformer(true, new PaymentZoomOutPageTransformer());
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
//This is the right place to connect the pages with a data struct!!!
@Override
public void onPageSelected(int position) {
// Here you can connect the current displayed page with some data..
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
//Here use the inflater to add views/pages
//Don't forget to do:
pagerAdapter.notifyDataSetChanged();
//When you're done...