Android Fragment – Utilizar el gestor de carga de la actividad en lugar de Fragmento. ¿Está bien?
Dado un fragmento que carga (una gran cantidad) de datos de la base de datos utilizando un cargador.
Problema:
- ¿Qué para establecer CursorAdapter (Contexto contexto, Cursor c, int flags) a fin de hacer que funcione con CursorLoader?
- Global Loader (LoaderManager) para su reutilización en múltiples Actividades / Fragmentos
- AsyncTaskLoader vs AsyncTask
- ExpandableListFragment con LoaderManager para el paquete de compatibilidad
- ¿Cómo pasar de managedQuery a LoaderManager / CursorLoader?
Tengo un adaptador del paginador que destruye el fragmento cuando el usuario se mueve lejos de la pestaña que lo sostiene y lo recrea cuando el usuario vuelve a esa pestaña. Debido a esta recreación, un cargador nuevo se crea cada vez y los datos se carga cada vez.
Pregunta:
Para evitar recrear el cargador cada vez que se crea el fragmento, ¿está bien usar getActivity.getSupportLoaderManager.initLoader(loaderId, null, false)
en el método onActivityCreated
del fragmento?
Lo he probado, probado y parece estar funcionando bien. Pero no estoy convencido de que sea correcto.
- ¿Cuál es el alcance de LoaderManager?
- Confundido sobre CursorLoaders y usarlos con un SQLiteOpenHelper personalizado
- Loader y LoaderManager - ¿Cómo determinar si un cargador actual está activo y en ejecución?
- ¿Debo usar Fragments para obtener un LoaderManager?
- Diferencia entre restartLoader y onContentChanged
- IllegalStateException "intenta volver a abrir un objeto ya cerrado" en SimpleCursorAdapter de ContentProvider
- Obtener "Llamado doStart cuando ya se inició" de LoaderManager. ¿Por qué?
- Explique AsyncTaskLoader
En realidad, revisando el código fuente, terminas haciendo lo mismo.
Fragment.getLoaderManager:
/** * Return the LoaderManager for this fragment, creating it if needed. */ public LoaderManager getLoaderManager() { if (mLoaderManager != null) { return mLoaderManager; } if (mActivity == null) { throw new IllegalStateException("Fragment " + this + " not attached to Activity"); } mCheckedForLoaderManager = true; mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true); return mLoaderManager; }
mWho
es básicamente el ID del fragmento.
final void setIndex(int index, Fragment parent) { mIndex = index; if (parent != null) { mWho = parent.mWho + ":" + mIndex; } else { mWho = "android:fragment:" + mIndex; } }
La diferencia en Activity.getLoaderManager()
es que quien será (root)
Así que a pesar de que usted puede hacer lo que está pidiendo, llamar directamente desde el fragmento podría ser un mejor enfoque
- Código fuente de la actividad
- Código fuente del fragmento
Renuncia: Sólo he comprobado el código fuente en la última versión, pero no espero que sea muy diferente
¿Puedo preguntar por qué simplemente no conservas el Fragmento? Parece que lo que necesitas es crear el Loader en el Fragmento y crear el fragmento con setRetainInstance (true). En este caso, recuerde proporcionar un TAG cuando agregue el fragmento. De esta manera el fragmento sobrevivirá incluso a cambios de configuración de actividad y sólo la vista se recreará dejando su cargador con vida.
- Persistencia de datos de Android después de la desinstalación
- API para procesamiento de lenguaje natural en Android