Comment CursorLoader avec LoaderManager savons pour envoyer le curseur à un CursorAdapter?
Je passais par certains de mon code et j'ai réalisé que je ne sais pas vraiment comment un CursorLoader
et LoaderManager
combinaison avec un CursorAdapter
connecter. Heres la partie que je suis confus dans.
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);
Donc comment le query()
méthode de mon custom ContentProvider
savoir pour l'envoyer à l' CursorAdapter
? Je ne vois pas le lien. Je comprends tout le reste, mais ce que cette question est sur. Oh, et je dois le mentionner, le code fonctionne très bien.
- Je commence à soupçonner que vous êtes de poser ces questions juste à vis avec moi, sachant que je ne peux pas m'empêcher de répondre (même quand je suis au travail lol)
- idk quoi vous parlez 🙂 mais si vous êtes là...
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, consultez l'exemple de code à ce post et ce post pour un regard plus en profondeur dans la façon dont le processus fonctionne.
Et maintenant, pour répondre à vos questions...
Bien, d'abord, rappelez-vous que
getContentResolver().query()
ne pas appeler le fournisseur de contenuquery
méthode directement. Vous êtes en invoquant le contenu de résolution de la méthode de requête, qui analyse laUri
, détermine le fournisseur que vous souhaitez invoquer, et puis appels de votre fournisseurquery
méthode.Je vais vous guider à travers le processus à l'aide de la API Démos comme un exemple. Notez que l'API démos utilise un
ListFragment
au lieu d'unListActivity
(la différence n'est pas importante dans le contexte de cette question).Tout d'abord, créer (et configurer) le
CursorAdapter
.Après cette instruction est exécutée, la
SimpleCursorAdapter
sait comment il doit associer le curseur de données avec votre point de vue. Toutes les données dans le curseur deContacts.DISPLAY_NAME
colonne sera associé avec la vue avec idandroid.R.id.text1
, etc.Note que vous avez passé un
null
curseur en tant que troisième argument du constructeur. C'est très important, comme nous l'avons interrogé pas encore de données (c'est leLoaderManager
etCursorLoader
's d'emploi).Prochaine, initialiser le chargeur.
Ceci dit l'
LoaderManager
créer et démarrer leLoader
correspondant à l'id de0
.La
LoaderManager
appelsonCreateLoader(int id, Bundle args)
.onCreateloader
renvoie une sous-classe de laLoader<Cursor>
de l'interface (c'est à dire unCursorLoader
, dans ce cas). CetteCursorLoader
va exécuter la requête initiale et va se mettre à jour lorsque des modifications de données.Si votre activité/fragment a plus d'un chargeur, vous devez alors utiliser
switch(id)
pour déterminer le chargeur qui a été chargé de commencer le processus de chargement.La requête de curseur est passé à
onLoadFinished()
.Immédiatement après la
CursorLoader
est instancié et renvoyé à l'étape 3, leCursorLoader
effectue la requête initiale sur un thread séparé et un curseur est retourné. Lorsque leCursorLoader
finitions de la requête, il retourne la nouvelle interrogé curseur à laLoaderManager
, qui transmet ensuite le curseur de laonLoadFinished
méthode. À partir de la documentation, "laonLoadFinished
méthode est appelée lors de créée précédemment chargeur a fini sa charge."La requête de données est associée à la
CursorAdapter
.Noter que
onLoadFinished
est aussi généralement là que vous mettez à jour l'activité/du fragment de l'INTERFACE utilisateur avec les données demandées. Ce n'est pas nécessaire dans ce cas, comme nous l'avons précédemment appelésetListAdapter(mAdapter)
. LeListFragment
sait comment utiliser lesCursorAdapter
(voir l'étape 1)... tout ce que nous devons faire est de passer la carte le curseur avecswapCursor
, et laListFragment
prendra soin d'afficher les données sur l'écran pour nous.Laissez-moi savoir si vous avez des questions (ou si il y a des fautes de frappe, etc.).
TL;DR
Le curseur qui contient vos données interrogées est associée à la
CursorAdapter
dansonLoadFinished
. Ceci est habituellement fait en appelantmAdapter.swapCursor(data)
.getContentResolver().query()
. Dans ce cas, dois-je fermer explicitement, ou est-ce encore gérés par la classe elle-même?CursorLoader
+LoaderManager
alors vous devriez pas fermer laCursor
s (ou sinon une exception sera probablement jeté). Extrêmement court, mais l'explication détaillée de ce qui se passe est que leActivity
raconte l'LoaderManager
pour effectuer certaines actions pendant laActivity
du cycle de vie (c'est à dire qu'il doit demander à l'LoaderManager
à conserver sonLoader
s sur un changement de configuration). LeLoaderManager
va réagir à ces demandes par l'appel de laCursorLoader
méthodes (c'est à direonStartLoading
,onStopLoading
, et un tas d'autres méthodes héritées de laLoader
classe).CursorLoader
fermera ses curseurs en conséquence (c'est à dire dansonReset
, etc.). En d'autres termes, ce n'est pas leLoaderManager
de clôture, les curseurs... c'est laLoaderManager
dire laCursorLoader
pour fermer les curseurs.CursorLoader
s haha. Vous devriez fermer les curseurs interrogé avecgetContentResolver().query
mais, depuis les premières curseurs ne sont pas gérés.onActivityCreated()
. Je suis d'accord avec vous que Google documentation est un peu vague sur ce point... mais je n'ai jamais eu aucun problème avec l'initialisation de Chargeurs enonActivityCreated()
.SimpleCursorAdapter
avecCursorAdapter
à l'aide deCursorLoader
?