android - loadercallbacks
CursorLoader no se actualiza después del cambio de datos (3)
¿ setNotificationUri(ContentResolver cr, Uri uri)
a setNotificationUri(ContentResolver cr, Uri uri)
en el Cursor
antes de devolverlo en ContentProvider.query()
?
¿Y llamó a getContext().getContentResolver().notifyChange(uri, null)
en el método ''insertar'' de su ContentProvider
?
EDITAR:
Para obtener un ContentResolver
llame a getContext().getContentResolver()
en su ContentProvider
.
He creado una pequeña aplicación, tratando de entender la funcionalidad de LoaderManager
y CursorLoader
-classes.
He implementado LoaderCallbacks<Cursor>
en mi clase FragmentActivity
y todo funciona bien, excepto el hecho de que cuando actualizo mis datos a través de ContentResolver.update()
o ContentResolver.insert()
onLoadFinished()
, onLoadFinished()
no se llama como resultado mis datos no se actualizan.
Tengo un ContentProvider personalizado y me pregunto si el problema está en mi ContentProvider sin notificar que los datos cambiaron o algo más.
La respuesta aceptada fue un poco difícil de entender, así que estoy escribiendo la respuesta para facilitar la tarea a otros desarrolladores.
- Vaya a la clase en la que ha ampliado el
ContentProvider
Encuentre el método query () que tiene la siguiente sintaxis
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Escriba esta línea donde está regresando el cursor
cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor;
Al final, mi método de consulta se ve así
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor;
cursor = noticeDbHelper.getReadableDatabase().query(
NoticeContract.NoticeTable.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
//This line will let CursorLoader know about any data change on "uri" , So that data will be reloaded to CursorLoader
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}`
También verifique si llama a algún lugar cursor.close (), porque en este caso anula el registro del observador de contenido registrado por CursorLoader. Y el cierre del cursor está gestionado por CursorLoader.