Actuellement, aucune implémentation par défaut de RecyclerView.Adapter n'est disponible.
Peut-être avec la version officielle, Google l'ajoutera.
Comme il n'y a pas de support pour CursorAdapter
le RecyclerView
moment, comment pouvons - nous utiliser RecyclerView
avec une base de données? Aucune suggestion ?
android
simplecursoradapter
android-recyclerview
Chiot perdu
la source
la source
setHasStableIds(true)
Ma solution consistait à contenir un membre CursorAdapter dans mon implémentation recyclerView.Adapter. Puis en passant toute la gestion de la création de la nouvelle vue et en la liant à l'adaptateur de curseur, quelque chose comme ceci:
la source
public void changeCursor(Cursor cursor){ mCursorAdapter.changeCursor(cursor); notifyDataSetChanged(); }
Puisque votre question dit "Comment utiliser
RecyclerView
avec une base de données" et que vous ne spécifiez pas si vous voulez SQLite ou quoi que ce soit d'autre avec leRecyclerView
, je vais vous donner une solution hautement optimale. J'utiliserai Realm comme base de données et vous laisserai afficher toutes les données dans votre fichierRecyclerView
. Il prend également en charge les requêtes asynchrones sans utiliserLoaders
niAsyncTask
.Pourquoi royaume?
Étape 1
Ajoutez la dépendance gradle pour Realm, la dépendance pour la dernière version se trouve ici
Étape 2
Créez votre classe de modèle, par exemple, disons quelque chose de simple comme
Data
qui a 2 champs, une chaîne à afficher à l'intérieur de laRecyclerView
ligne et un horodatage qui sera utilisé comme itemId pour permettreRecyclerView
à l'animation des éléments. Notez que j'étendsRealmObject
ci - dessous en raison de laquelle votreData
classe sera stockée sous forme de table et toutes vos propriétés seront stockées sous forme de colonnes de cette tableData
. J'ai marqué le texte de données comme clé primaire dans mon cas car je ne veux pas qu'une chaîne soit ajoutée plus d'une fois. Mais si vous préférez avoir des doublons, créez l'horodatage sous la forme @PrimaryKey. Vous pouvez avoir une table sans clé primaire, mais cela posera des problèmes si vous essayez de mettre à jour la ligne après l'avoir créée. Une clé primaire composite au moment de la rédaction de cette réponse n'est pas prise en charge par Realm.Étape 3
Créez votre mise en page pour savoir comment une seule ligne doit apparaître dans le
RecyclerView
. La disposition d'un élément à une seule ligne à l'intérieur de notreAdapter
est la suivanteRemarquez que j'ai gardé un en
FrameLayout
tant que racine même si j'ai unTextView
intérieur. Je prévois d'ajouter plus d'éléments dans cette mise en page et donc de la rendre flexible pour le moment :)Pour les curieux, voici à quoi ressemble actuellement un seul élément.
Étape 4
Créez votre
RecyclerView.Adapter
implémentation. Dans ce cas, l'objet de source de données est un objet spécial appeléRealmResults
qui est essentiellement un LIVEArrayList
, en d'autres termes, lorsque des éléments sont ajoutés ou supprimés de votre table, cetRealmResults
objet se met à jour automatiquement.Notez que
notifyItemRemoved
j'appelle avec la position à laquelle la suppression a eu lieu mais je n'appelle PASnotifyItemInserted
ounotifyItemRangeChanged
parce qu'il n'y a pas de moyen direct de savoir à quelle position l'élément a été inséré dans la base de données puisque les entrées de royaume ne sont pas stockées de manière ordonnée. L'RealmResults
objet se met à jour automatiquement chaque fois qu'un nouvel élément est ajouté, modifié ou supprimé de la base de données, nous l'appelonsnotifyDataSetChanged
lors de l'ajout et de l'insertion d'entrées en bloc. À ce stade, vous êtes probablement préoccupé par les animations qui ne seront pas déclenchées car vous appeleznotifyDataSetChanged
à la place desnotifyXXX
méthodes. C'est exactement pourquoi lagetItemId
méthode renvoie l'horodatage de chaque ligne à partir de l'objet de résultats. L'animation est réalisée en 2 étapes avecnotifyDataSetChanged
si vous appelezsetHasStableIds(true)
puis remplacezgetItemId
pour fournir autre chose que juste la position.Étape 5
Ajoutons le
RecyclerView
à notreActivity
ouFragment
. Dans mon cas, j'utilise unActivity
. Le fichier de mise en page contenant leRecyclerView
est assez simple et ressemblerait à quelque chose comme ça.J'ai ajouté un
app:layout_behavior
depuis monRecyclerView
entrée dans unCoordinatorLayout
que je n'ai pas posté dans cette réponse par souci de concision.Étape 6
Construisez le
RecyclerView
code in et fournissez les données dont il a besoin. Créez et initialisez un objet Realm à l'intérieuronCreate
et fermez-le à l'intérieuronDestroy
un peu comme la fermeture d'uneSQLiteOpenHelper
instance. Au plus simple, votreonCreate
intérieurActivity
ressemblera à ceci. LainitUi
méthode est l'endroit où toute la magie se produit. J'ouvre une instance de Realm à l'intérieuronCreate
.Notez que dans la première étape, je demande à Realm de me donner tous les objets de la
Data
classe triés par leur nom de variable appelé data de manière asynchrone. Cela me donne unRealmResults
objet avec 0 éléments sur le thread principal que je mets sur leAdapter
. J'ai ajouté unRealmChangeListener
pour être averti lorsque les données ont fini de charger à partir du fil d'arrière-plan où j'appellenotifyDataSetChanged
avec monAdapter
. J'ai également appelésetHasStableIds
true pour permettre à l'RecyclerView.Adapter
implémentation de suivre les éléments ajoutés, supprimés ou modifiés. LeonDestroy
for myActivity
ferme l'instance RealmCette méthode
initUi
peut être appelée à l'intérieuronCreate
de votreActivity
ouonCreateView
ouonViewCreated
de votreFragment
. Notez les choses suivantes.Étape 7
BAM! L' intérieur de votre Il y a des données de base de données
RecyclerView
asynchonously chargée sansCursorLoader
,CursorAdapter
,SQLiteOpenHelper
avec des animations. L'image GIF présentée ici est un peu lente, mais les animations se produisent lorsque vous ajoutez des éléments ou les supprimez.la source
Vous pouvez implémenter vous-même toutes les méthodes requises. J'ai récemment fait ma propre implémentation en copiant simplement le code de CursorAdapter.
la source
J'ai créé un RecyclerViewCursorAdapter en utilisant un SortedList comme backend, en étendant RecyclerView.Adapter
Peut être utilisé avec SQLiteCursor et les chargeurs
la source
Juste une autre réponse, puisque je n'aimais pas celle acceptée (dont imo n'a pas d'utilisation intuitive).
Ce qui suit est ma propre implémentation, qui est très similaire à (et partiellement inspirée par)
SimpleCursorAdapter
:Vous pouvez le modifier pour d'autres usages particuliers, mais avec un curseur, il fonctionne comme le
SimpleCursorAdapter
fait, uniquement avec un fichierRecyclerView
.la source
Après avoir récupéré les données de la base de données et les stocker dans une liste, cela devrait peut-être ressembler à ceci:
ajouter des données à recyclerview
la source
Voici mon implémentation de cursoradapter pour une vue de recyclage. Il prend en charge OnItemClickListener, OnLongItemClickListener, OnfooterClickListener, les sections et le pied de page. Ne prend pas en charge l'en -tête, onHeaderClickListner, le défilement rapide, l'en-tête collant ou les sections collantes.
Étendez simplement cet adaptateur et créez votre propre adaptateur. Remplacez les méthodes fournies. et passez le curseur de la méthode OnCursorLoadFinished.Si l'adaptateur est déjà créé, swapCursor ()
la source
L'implémentation la plus simple consiste à utiliser un objet curseur dans l'adaptateur et à passer le curseur au constructeur de viewholder pour modifier les vues et changer la position du curseur dans onBindViewholder.
Si vous utilisez le curseur Loader, appelez la méthode setCursor
onLoadfinished()
et passez null dansonLoadReset()
}
la source
Enfin, nous avons une implémentation de RecyclerView.Adapter pour base de données / réseau.
Il a réalisé avec une architecture Android Composants :
Base de données de la salle: couche de base de données au-dessus de la base de données SQLite qui prend en charge les tâches banales que vous avez l'habitude de gérer avec un
SQLiteOpenHelper
. Support de base de données qui sert de point d'accès à la base de données SQLite sous-jacente. La base de données Room utilise le DAO pour émettre des requêtes vers la base de données SQLite.ViewModel: fournit des données à l'interface utilisateur. Agit comme un centre de communication entre le référentiel et l'interface utilisateur. Masque l'origine des données de l'interface utilisateur. Les instances ViewModel survivent à la récréation Activité / Fragment.
LiveData: une classe de détenteurs de données qui peut être observée. Contient / met toujours en cache la dernière version des données. Avertit ses observateurs lorsque les données ont changé. LiveData est conscient du cycle de vie. Les composants de l'interface utilisateur observent simplement les données pertinentes et n'arrêtent ni ne reprennent l'observation. LiveData gère automatiquement tout cela car il est conscient des changements d'état du cycle de vie pertinents tout en observant.
la source
Vous pouvez utiliser la base de données SQLite pour stocker les détails. Il est facile d'accéder aux données. Vous pouvez vérifier mon code sur github. https://github.com/thiru-wta/ToDo
Méthodes de base de données:
méthode get:
la source
Il vous suffit de suivre ces étapes:
view.adapter
, créez une ArrayList ou un Iterator initialisé avec une valeur nulle.swapdata(Arraylist<T> data)
. À l'intérieur, vous donnez une nouvelle valeur à la liste de tableaux, à l'itérateur ou à toute structure que le système peut itérer en utilisant la position entière dans la vue de liaison. Les valeurs de cette méthode sont transmises dans leonloaderfinished()
. Appelez ensuite juste après l'affectationnotifydatachange()
; ceux-ci demanderont auRecyclerView
de redessiner toute la liste avec les nouvelles données de l'ArrayList.Dans l'activité ou le fragment où vous utilisez le loadercalback, créez une méthode qui transforme le curseur en arraylist, ou itérateur, en fonction de la structure de données choisie dans l'adaptateur.
De cette façon, vous pouvez toujours utiliser le loadercalback sans bloquer le thread principal.
la source