ListView、CursorLoader、および CursorAdapter を使用した非常に単純な Fragment があります。すべてが単一のアクティビティにあります (フラグメントを切り替えるだけです)。私の問題は、initLoader() 呼び出しを置く場所に基づいて、状況によっては onLoadFinished() が 2 回呼び出されることです。それらの状況は次のとおりです。
- 設定変更(画面回転など)
- FragmentTransaction を使用して現在のフラグメントを別のフラグメントに置き換えてから、元に戻します (バックスタックをポップします)。この場合、1 つのリスト項目の詳細フラグメントです。
initLoader() が onCreateView() に配置されると、構成変更後に onActivityCreated() (ドキュメントで推奨) onLoadFinished() が 2 回呼び出されます。Rudik Krasniynosによる理由の説明があります。ただし、 onLoadFinished() は、バックスタックから新しいフラグメントをポップするときに 1 回だけ呼び出されます。
initLoader() が onResume()/onStart() メソッドに配置されると、上記の状況が逆になります。バックスタックをポップするための 2 つの onLoadFinished() 呼び出しと、構成変更のための 1 つの呼び出し。
したがって、問題は、onLoadFinished() を 2 回呼び出さずにローダーをどこで、またはどのように初期化するか、またはローダーを 2 回初期化しないように何をチェックするかです。ありがとう!
フラグメントを置き換えるコード:
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.root_view, fragment, tag);
ft.addToBackStack(null);
ft.commit();
CursorAdapter のコード:
//onCreateView
MyCursorAdapter mAdapter = new MyCursorAdapter(getActivity(), null, 0);
mList.setAdapter(mAdapter);
//in other/same lifecycle callbacks
getLoaderManager().initLoader(ID, null, this);
サポート ライブラリ v18 を使用しています。