web-dev-qa-db-ja.com

ViewPager-onCreateViewが常に呼び出されるとは限りません

10ページのViewPagerがあります。最後(10番目)のページを開始すると、フラグメントのonCreateView()メソッドが呼び出されます。 9ページ目にスワイプすると、onCreateView()も呼び出されます。しかし、10ページ目に戻ると、onCreateView()は呼び出されません。どうしましたか?

16
Bakus123

FragmentStatePagerAdapterを拡張してみてください

19
Vinay

これは、FragmentPagerAdapterがすべてのフラグメントをメモリに保持するためです。したがって、最初にフラグメントにアクセスすると、onCreateが呼び出されますが、2回目はAndroidがメモリ内を検索するため、onCreateを呼び出す必要はありません。

フラグメントが表示されるたびにOnCreateでコードを実行する必要がある場合は、コードをgetItem(int id)に移動する必要があります。

公式ドキュメントを参照してください: http://developer.Android.com/reference/Android/support/v4/app/FragmentPagerAdapter.html

3
Fran b

同じ問題が発生しました。解決策は、次のように、ViewPagerインスタンスのアダプターを再度割り当てることでした。

pager.setAdapter(adapter);

これにより、viewPagerから「mItems」プロパティが再起動され、キャッシュが削除されます。

しかし、それが安全な解決策かどうかはわかりません

何も悪いことはありません。 ViewPagerにはすでにページがあるため、ページを作成する必要はありません。

2
CommonsWare

スワイプでも呼び出されるonPageSelectからアダプターgetItemを呼び出し、コードをgetItem内、またはonPageSeelect自体に配置できます。

1
Zvi

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...
0
JamesC