最初に、下位互換性のために ActionBarSherlock ライブラリを使用していることに言及する必要があります。
ListFragment
最初に開始したときにを追加するアクティビティがあります。Loader
私が実装したカスタムがあり、 AsnycTaskLoader の例に非常に厳密に従っています。私ListFragment
のインターフェイスを実装しLoaderCallbacks<Cursor>
ます。onCreateLoader()
フラグメントが追加されたとき ( 、onLoaderFinished()
)、置き換えられたとき ( )に、適切なすべてのコールバック メソッドが呼び出されますonLoaderReset()
。
私のonActivityCreated(Bundle)
方法は次のようになります。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAccountsDbAdapter = new AccountsDbAdapter(getActivity().getApplicationContext());
setHasOptionsMenu(true);
mCursorAdapter = new AccountsCursorAdapter(getActivity()
.getApplicationContext(), R.layout.list_item_account, null,
new String[] { DatabaseHelper.KEY_NAME },
new int[] { R.id.account_name }, 0);
setListAdapter(mCursorAdapter);
getLoaderManager().initLoader(0, null, this);
}
その後、ListFragment
別の Fragment B に置き換えられます。ユーザーが [戻る] ボタンを押すと、Fragment B が削除され、ListFragment が再び追加されます。ただし、リストは空で、android:empty
要素のみが表示され、LoaderCallback メソッドは呼び出されません。デバッガーを使用して、それgetLoaderManager().initLoader(0, null, this);
が実際に呼び出されているかどうかを判断できますが、他には何もありません。に変更するとgetLoaderManager().restartLoader(0, null, this);
、コールバックが呼び出されますが、リストは空のままです (データはありますが、ビューは更新されません)。
ListFragment がレイアウトに返されたときに更新するにはどうすればよいですか? 以前にこれに遭遇した人はいますか?どのように修正しましたか?
参考までに、ここに私のコールバックメソッドがあります
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new AccountsCursorLoader(this.getActivity()
.getApplicationContext());
}
@Override
public void onLoadFinished(Loader<Cursor> loaderCursor, Cursor cursor) {
mCursorAdapter.swapCursor(cursor);
mCursorAdapter.notifyDataSetChanged();
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
mCursorAdapter.swapCursor(null);
}
いくつかのメモ:
- カスタム コンテンツ ビューでは使用できないというメッセージが表示される
setListShown(true)
ため、この例のメソッドは使用できません。IllegalStateException
- My
AccountsCursorAdapter
は aを拡張し、メソッドSimpleCursorAdapter
のみを変更します。bindView()