¿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.

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).


  1. 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 columna Contacts.DISPLAY_NAME del cursor se asociarán con la vista con id android.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 de LoaderManager y CursorLoader ).

  2. A continuación, inicialice el cargador.

     getLoaderManager().initLoader(0, null, this); 

    Esto le dice al LoaderManager que cree e inicie el Loader correspondiente a id 0 .

  3. LoaderManager llama onCreateLoader(int id, Bundle args) .

    onCreateloader devuelve una subclase de la interfaz Loader<Cursor> (es decir, un CursorLoader , en este caso). Este CursorLoader 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.

  4. El cursor consultado se pasa a onLoadFinished() .

    Inmediatamente después de que el CursorLoader se CursorLoader una instancia y se devuelve en el paso 3, el CursorLoader realiza la consulta inicial en un subproceso independiente y se devuelve un cursor. Cuando CursorLoader termina la consulta, devuelve el cursor recién LoaderManager al LoaderManager , que pasa el cursor al método onLoadFinished . De la documentación, "el método onLoadFinished se llama cuando un cargador previamente creado ha terminado su carga."

  5. 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 previamente setListAdapter(mAdapter) . El ListFragment sabe cómo usar el CursorAdapter (ver paso 1) … todo lo que necesitamos hacer es pasar el adaptador al cursor con swapCursor , y el ListFragment 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) .

  • Datos fuera de sincronización entre un CursorLoader personalizado y un CursorAdapter respaldando un ListView
  • GROUP BY con CursorLoader
  • El uso de CursorLoader para obtener correos electrónicos provoca la duplicación de correos electrónicos
  • AlphabetIndexer con adaptador personalizado administrado por LoaderManager
  • Cómo utilizar dos cursores y CursorJoiner en LoaderManager en android
  • CursorLoader para varios ContentProviders
  • ¿Cómo leer un DB de SQLite en android con un cursorloader?
  • cursor loader no se actualiza en mi pestaña de desplazamiento hasta que reinicie la aplicación
  • ¿Qué hace LoaderManager?
  • ¿Cómo manipular los datos del cursor antes de mostrarlo en un ListView (usando un cargador)?
  • Android OnLoadFinished () no se llama cuando el cursor cambia
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.