41

FragmentPagerAdapter を使用するアプリケーションを作成しています。アダプター内のフラグメントは、外部データに従って更新する必要がありますが、そうはなりません。getItem 関数で、フラグメント クラスが 1 回だけインスタンス化されていることに気付きました。

@Override
public Fragment getItem(int position) {
    TabInfo info = mTabs.get(position);
    return Fragment.instantiate(mContext, info.clss.getName(),
                info.args);
}

クラスを削除して新しいクラスを使用しても、何も役に立ちません。このメソッドは、タブが初めて読み込まれたときに一度だけ呼び出され、その後は二度と呼び出されません。誰にも理由がありますか?

ありがとう!

4

3 に答える 3

53

getItem は、アダプターがフラグメントを必要とするときにフラグメントが存在しない場合に呼び出されます。

フラグメントがすでに FragmentManager に存在する場合、インスタンス化する必要はなく、getItem を呼び出す必要はありません。

既存のフラグメントを更新するには、FragmentManager またはアダプターからフラグメントを取得し、それに応じて操作する必要があります。

デフォルトでは、viewpager は表示されているページとその隣のページのフラグメントを作成します。つまり、まず、位置 1 と 2 のフラグメントです。ページ 2 にスワイプすると、位置 3 のフラグメントが作成されます。

于 2013-10-12T21:46:58.233 に答える
4

FragmentStatePagerAdapter代わりに単に使用するFragmentPagerAdapter

FragmentStatePagerAdapter は、フラグメントの不要なインスタンスのインスタンスを破棄し、オンデマンドで再度インスタンス化します。一方、FragmentPagerAdapter は Fragment をデタッチして再アタッチするだけです。そのため、FragmentPagerAdapter で作成されたフラグメントが破棄されることはありません。そのため、私は常に FragmentStatePagerAdapter を好みます。

于 2016-06-20T13:33:54.660 に答える