Manera elegante de manejar LoaderCallbacks con DialogFragment

Tengo un DialogFragment que utiliza un cursor para setMultiChoiceItems . Este Cursor se LoaderManager con la ayuda del LoaderManager .

¿Cuál es la mejor manera de manejar esto con el método onCreateDialog? El cargador se inicia después de que este método ha sido llamado, por lo que el Cursor no está disponible para AlertDialog.Builder al principio.

¿Hay un método para actualizar la interfaz de usuario de diálogo una vez que onLoadFinished se llama? Idealmente, me gustaría establecer una interfaz de usuario de carga inicial, y una vez que el cursor esté disponible, actualizar la interfaz de usuario.

Tengo una implementación que está trabajando que simplemente toma la carga del cursor del Fragmento y en la actividad. No me gusta esto, ya que no es muy modular. Podría escribir una clase Fragment que pobló sus propias vistas e intercambiarlas cuando el Cursor ha terminado, pero esto tampoco parece muy elegante.

Puesto que esto es más una cuestión de diseño que un problema de codificación específico, he dejado fuera el código de ejemplo. Las respuestas que busco deben estar basadas en cómo administrar este tipo de flujo de trabajo muy bien dentro de la clase DialogFragment, usando AlertDialog.Builder para crear la vista Diálogo.

Vieja pregunta pero quizás la respuesta ayuda a alguien.

  • Inicie el CursorLoader en onCreate (), onCreateView o onActivityCreated (), realmente no importa imo
  • Cree el adaptador y el cuadro de diálogo en onCreateDialog. El diálogo utilizará un adaptador vacío hasta que se carguen los datos
  • Cambie el cursor del adaptador en onLoadFinished

He aquí un ejemplo de código:

 public class MyDialogFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<Cursor> { private CursorAdapter mAdapter; public static MyDialogFragment newInstance() { return new MyDialogFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLoaderManager().initLoader(0, null, this); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_single_choice, null, new String[] {FolderColumns.NAME}, new int[] {android.R.id.text1}, 0); return new AlertDialog.Builder(getContext()) .setAdapter(mAdapter, null) .create(); } @Override public synchronized Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri uri = ...; return new CursorLoader(getActivity(), uri, null, null, null, null); } @Override public synchronized void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } @Override public synchronized void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { if (cursor != null && !cursor.isClosed()) { mAdapter.swapCursor(cursor); } } } 

Tenga en cuenta que el adaptador no se puede crear en onCreate porque onCreateDialog se llama antes onCreate.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.