loadercallbacks getloadermanager example android debugging android-contentprovider android-loadermanager android-cursorloader

android - getloadermanager - ¿Cómo puedo actualizar el cursor desde un CursorLoader?



getloadermanager deprecated (1)

Así que tengo mi MainDisplayActivity que implementa tanto Activity como LoaderManager.LoaderCallbacks<Cursor> . Aquí tengo A ListView , que llené con la información de la Agenda que obtengo de mi base de datos usando ContentProvider. También tengo un GridView que es un calendario. Lo tengo configurado al hacer clic en una celda, que la agenda se actualiza con el día en que se hace clic. Mi problema es que al reutilizar el Loader que creé en onCreate() dentro de setOnItemClickListener (), no actualiza la información con el nuevo cursor que estoy creando. Puedo simplemente crear un nuevo cargador con otro ID, y funciona una vez, pero una vez que hago clic en otro día, deja de refrescarse. El problema, se encuentra en el cursor. ¿Cómo puedo actualizar un cursor desde un cargador para no tener que seguir creando un nuevo cargador? ¡Gracias por adelantado!

Llamada inicial para crear el cargador en onCreate () en My MainDisplayActivity class:

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

Estos son los métodos reemplazados de LoaderCallbacks<Cursor>

@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri baseUri = SmartCalProvider.CONTENT_URI; return new CursorLoader(this, baseUri, args.getStringArray("projection"), args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null ); } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { agendaAdapter.swapCursor(arg1); } @Override public void onLoaderReset(Loader<Cursor> arg0) { //Not really sure how this works. Maybe I need to fix this here? agendaAdapter.swapCursor(null); } public void makeProviderBundle(String[] projection, String selection, String[] selectionArgs, String sortOrder){ /*this is a convenience method to pass it arguments * to pass into myBundle which in turn is passed * into the Cursor loader to query the smartcal.db*/ myBundle = new Bundle(); myBundle.putStringArray("projection", projection); myBundle.putString("selection", selection); myBundle.putStringArray("selectionArgs", selectionArgs); if(sortOrder != null) myBundle.putString("sortOrder", sortOrder); }

Cualquier código adicional necesario no dude en preguntar. Gracias de nuevo por cualquier ayuda!


Solo necesita mover su código un poco y llamar a restartLoader . Es decir,

  1. Cuando el usuario hace clic en un elemento de la lista, de alguna manera cambia la variable de instancia privada que se devuelve en getChosenDate() (estoy intencionalmente vago porque no especificó exactamente qué getChosenDate() ).

  2. Una vez que se realiza el cambio, llame a getLoaderManager().restartLoader() en su Loader . Los datos anteriores se descartarán y restartLoader activará onCreateLoader para que se onCreateLoader a llamar. Esta vez, getChosenDate() devolverá un valor diferente (según el elemento de la lista en el que se hizo clic) y eso debería hacerlo. Su implementación de onCreateLoader debería verse más o menos así:

    @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri baseUri = SmartCalProvider.CONTENT_URI; 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); return new CursorLoader( this, baseUri, args.getStringArray("projection"), args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null); }

Avísame si tiene sentido. :)