J'ai créé une petite application, essayant de comprendre les fonctionnalités des classes LoaderManager
et CursorLoader
-.
J'ai implémenté LoaderCallbacks<Cursor>
Sur ma classe FragmentActivity
- et tout fonctionne bien, sauf que lorsque je mets à jour mes données via ContentResolver.update()
ou ContentResolver.insert()
- méthodes, onLoadFinished()
n'est pas appelée et par conséquent mes données ne sont pas mises à jour.
J'ai un ContentProvider personnalisé et je me demande si le problème vient de mon ContentProvider qui ne notifie pas que les données ont changé ou autre chose.
Avez-vous appelé setNotificationUri(ContentResolver cr, Uri uri)
sur le Cursor
avant de le renvoyer dans ContentProvider.query()
?
Et avez-vous appelé getContext().getContentResolver().notifyChange(uri, null)
dans la méthode 'insert' de votre ContentProvider
?
ÉDITER:
Pour obtenir un ContentResolver
appelez getContext().getContentResolver()
dans votre ContentProvider
.
Vérifiez également si vous appelez quelque part cursor.close (), car dans ce cas, vous annulez l'observateur de contenu qui a été enregistré par CursorLoader. Et la fermeture du curseur est gérée par CursorLoader.
La réponse acceptée était un peu difficile à comprendre, donc j'écris la réponse pour la rendre facile pour les autres développeurs.
ContentProvider
Recherchez la méthode query () qui a la syntaxe suivante
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Écrivez cette ligne où vous retournez le curseur
cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor;
Au final, ma méthode de requête ressemble à ceci
@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;
}`