¿Cómo sabe CursorLoader con LoaderManager para enviar el cursor a un CursorAdapter?
Estaba pasando por algunos de mi código y me di cuenta de que en realidad no saben cómo una CursorLoader
y LoaderManager
combinación utilizada con un CursorAdapter
conectar. Aquí está la parte en la que estoy confundido.
agendaAdapter = new MyAgendaAdapter(this, null); makeProviderBundle(new String[] {"_id", "event_name", "start_date", "start_time", "end_date", "end_time", "location"}, "date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null); getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this); list.setAdapter(agendaAdapter);
Entonces, ¿cómo el método query()
de mi ContentProvider
personalizado sabe enviarlo a ese CursorAdapter
específico? Simplemente no veo la conexión. Entiendo todo lo demás, pero lo que esta pregunta es. Ah, y debo mencionar, el código funciona bien.
- Uso de CursorLoader sin ContentProvider
- Android RecyclerView + CursorLoader + ContentProvider + "Cargar más"
- Android CursorLoader vs AsyncQueryHandler?
- ¿Cuál es la ventaja de los cargadores sobre Asynctask en Android?
- SherlockFragmentActivity con múltiples ListFragments y batallas con cursor SQLite
- ViewPager PagerAdapter con cursor - CursorLoader.onLoadFinished no se llama con una consulta diferente
- Obtener SQLiteCursorLoader para observar los cambios de datos
- Mantenimiento de un ListView donde cada elemento de lista tiene una relación de uno a muchos
- Filtro ListView con CursorLoader Y FilterQueryProvider?
- Android Historial de navegación dejando fuera sólo algunos sitios
- Cómo especificar el orden de clasificación de la consulta a un proveedor de contenido
- IllegalStateException - Apoyo LoaderManager con AutocompleteTextView
- CursorLoader, obtiene URI para la base de datos local
En primer lugar, echa un vistazo a la muestra de código en este post y este post para una mirada aún más en profundidad en cómo funciona el proceso.
Y ahora, para responder a sus preguntas …
¿Cómo funciona el método query () de mi
ContentProvider
personalizado …?
Bueno, primero recuerde que getContentResolver().query()
no invoca directamente el método de query
del proveedor de contenido. Está invocando el método de consulta del resolvedor de contenido, que analiza el Uri
, determina el proveedor al que desea invocar y, a continuación, llama al método de query
su proveedor .
¿Cómo se envía la consulta a ese
CursorAdapter
específico?
Le guiaré a través del proceso usando las demostraciones API como ejemplo. Tenga en cuenta que las demostraciones de API utilizan un ListFragment
lugar de ListActivity
(la diferencia no es importante en el contexto de esta pregunta).
-
Primero, cree (y configure) el
CursorAdapter
.mAdapter = new SimpleCursorAdapter( getActivity(), android.R.layout.simple_list_item_2, null, new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, new int[] { android.R.id.text1, android.R.id.text2 }, 0);
Después de ejecutar esta sentencia, el
SimpleCursorAdapter
sabe cómo debe asociar los datos del cursor con sus vistas. Los datos que se encuentren en la columnaContacts.DISPLAY_NAME
del cursor se asociarán con la vista con idandroid.R.id.text1
, etc.Tenga en cuenta que ha pasado un cursor
null
como el tercer argumento al constructor. Esto es muy importante , ya que aún no hemos consultado ningún dato (este es el trabajo deLoaderManager
yCursorLoader
). -
A continuación, inicialice el cargador.
getLoaderManager().initLoader(0, null, this);
Esto le dice al
LoaderManager
que cree e inicie elLoader
correspondiente a id0
. -
LoaderManager
llamaonCreateLoader(int id, Bundle args)
.onCreateloader
devuelve una subclase de la interfazLoader<Cursor>
(es decir, unCursorLoader
, en este caso). EsteCursorLoader
realizará la consulta inicial y se actualizará cuando cambie los datos.Si tu actividad / fragmento tiene más de un cargador, entonces usarás
switch(id)
para determinar el cargador específico al que se le ha indicado comenzar el proceso de carga. -
El cursor consultado se pasa a
onLoadFinished()
.Inmediatamente después de que el
CursorLoader
seCursorLoader
una instancia y se devuelve en el paso 3, elCursorLoader
realiza la consulta inicial en un subproceso independiente y se devuelve un cursor. CuandoCursorLoader
termina la consulta, devuelve el cursor reciénLoaderManager
alLoaderManager
, que pasa el cursor al métodoonLoadFinished
. De la documentación, "el métodoonLoadFinished
se llama cuando un cargador previamente creado ha terminado su carga." -
Los datos consultados están asociados con
CursorAdapter
.mAdapter.swapCursor(data);
Tenga en cuenta que
onLoadFinished
también suele ser donde se actualiza la interfaz de usuario de la actividad / fragmento con los datos consultados. Esto no es necesario en este caso, como hemos llamado previamentesetListAdapter(mAdapter)
. ElListFragment
sabe cómo usar elCursorAdapter
(ver paso 1) … todo lo que necesitamos hacer es pasar el adaptador al cursor conswapCursor
, y elListFragment
se encargará de mostrar los datos en la pantalla para nosotros.
Déjeme saber si tiene alguna pregunta (o si hay algún error tipográfico, etc.).
TL, DR
El cursor que contiene los datos consultados está asociado con CursorAdapter
en onLoadFinished
. Esto se realiza normalmente llamando a mAdapter.swapCursor(data)
.
- Android: ¿Puedo ignorar los errores "Vista primaria no es un TextView" y "sendUserActionEvent () mView == null"?
- Cuestión de gesto con mapview en la página de viewpager