Como posso atualizar meu ListFragment quando ele retorna ao layout da pilha de retorno?
Primeiro, devo mencionar que estou usando a biblioteca ActionBarSherlock para compatibilidade com versões anteriores.
Eu tenho uma atividade que adiciona umListFragment
quando é iniciado pela primeira vez. Eu tenho um costumeLoader
que eu implementei e siga oExemplo AsnycTaskLoader muito próximo. MinhasListFragment
implementa oLoaderCallbacks<Cursor>
interface. Todos os métodos de retorno de chamada apropriados são chamados quando o fragmento é adicionado (onCreateLoader()
, onLoaderFinished()
) e quando é substituído (onLoaderReset()
).
MinhasonActivityCreated(Bundle)
método é assim:
@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);
}
Mais tarde, oListFragment
é substituído por outro Fragmento B. Quando o usuário pressiona o botão Voltar, o Fragmento B é removido e o ListFragment é adicionado novamente. No entanto, a lista está vazia e apenas oandroid:empty
elementos são exibidos e nenhum dos métodos LoaderCallback é chamado. Eu posso usar o depurador para determinar quegetLoaderManager().initLoader(0, null, this);
é realmente chamado, mas nada mais. Quando eu mudo paragetLoaderManager().restartLoader(0, null, this);
, os callbacks são chamados, mas minha lista continua vazia (embora haja dados, a visualização não é atualizada).
Como posso obter o meu ListFragment para se atualizar quando é retornado para o layout? Alguém já encontrou isso antes, como você consertou isso?
FYI, aqui estão os meus métodos de callback
@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);
}
Algumas notas:
Eu não posso usar osetListShown(true)
métodos no exemplo, porque eu recebo umIllegalStateException
que não pode ser usado com uma exibição de conteúdo personalizada.MinhasAccountsCursorAdapter
estende umSimpleCursorAdapter
e modifica apenas obindView()
método.