J'ai l'habitude de mettre une vue spéciale à l'intérieur du fichier de mise en page comme décrit dans la ListActivity
documentation à afficher lorsqu'il n'y a pas de données . Cette vue a l'id "android:id/empty"
.
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_data" />
Je me demande comment cela peut être fait avec le nouveau RecyclerView
?
setEmptyView()
méthode simple contre unRecyclerView
...setEmptyView()
avait également un inconvénient. Lors du chargement des données, nous ne voulions pas afficher la vue videListView
, mais c'était le cas. Nous avons donc dû implémenter une logique. Actuellement, j'utilise stackoverflow.com/a/48049142/2914140 .Réponses:
Sur la même mise en page où est défini le
RecyclerView
, ajoutez leTextView
:Lors du
onCreate
ou du rappel approprié, vous vérifiez si l'ensemble de données qui alimente votreRecyclerView
est vide. Si l'ensemble de données est vide, l'RecyclerView
est également. Dans ce cas, le message apparaît à l'écran. Sinon, changez sa visibilité:la source
Pour mes projets j'ai réalisé cette solution (
RecyclerView
avecsetEmptyView
méthode):Et vous devez l'utiliser à la place de la
RecyclerView
classe:et
la source
Voici une solution utilisant uniquement un adaptateur personnalisé avec un type de vue différent pour la situation vide.
la source
getItemCount()
devrait être un oneliner mais ici nous avons un non trivialif
avec une logique cachée. Cette logique apparaît également maladroitementgetItemViewType
et Dieu sait où d'autreJ'utilise ViewSwitcher
dans le code, vous allez vérifier le curseur / jeu de données et changer de vue.
Vous pouvez également définir des animations si vous le souhaitez avec quelques lignes de code
la source
Puisque la réponse de Kevin n'est pas complète.
Il s'agit d'une réponse plus correcte si vous utilisez
RecyclerAdapter
la commandenotifyItemInserted
etnotifyItemRemoved
pour mettre à jour l'ensemble de données. Voir la version Kotlin ajoutée par un autre utilisateur ci-dessous.Java:
Kotlin
la source
RVEmptyObserver
Au lieu d'utiliser une personnalisation
RecyclerView
, l'extension d'uneAdapterDataObserver
est une solution plus simple qui permet de définir uneView
qui s'affiche lorsqu'il n'y a aucun élément dans la liste:Exemple d'utilisation:
Classe:
la source
checkIfEmpty()
dansonChanged()
etonItemRangeInserted()
Lors de la
getItemViewType
vérification de votre adaptateur, si l'adaptateur a 0 élément et si tel est le cas, renvoyez un viewType différent.Ensuite,
onCreateViewHolder
vérifiez si le viewType est celui que vous avez retourné plus tôt et gonflez une vue différente. Dans ce cas, un fichier de mise en page avec ce TextViewÉDITER
Si cela ne fonctionne toujours pas, vous pouvez définir la taille de la vue par programme comme ceci:
Et puis, lorsque vous gonflez votre appel de vue:
la source
onCreateViewHolder
quand mon jeu de données estnull
ou vide depuis que je dois retourner0
dansgetItemCount
.android:layout_gravity="center"
etandroid:layout_height="match_parent"
pour la vue parent recycleur.android:layout_height="match_parent"
. Bien que la ligne ne s'étende pas à la hauteur de l'écran.Voici ma classe pour afficher la vue vide, réessayer la vue (lorsque le chargement de l'api a échoué) et la progression du chargement pour
RecyclerView
activity_xml
La source est ici https://github.com/PhanVanLinh/AndroidRecyclerViewWithLoadingEmptyAndRetry
la source
Utilisez AdapterDataObserver dans RecyclerView personnalisé
Kotlin:
RecyclerViewEnum.kt
RecyclerViewEmptyLoadingSupport.kt
layout.xml
en activité utiliser de cette façon:
la source
StringDef
ouIntDef
annotationsJ'ai ajouté
RecyclerView
et alternativeImageView
auRelativeLayout
:puis dans
Adapter
:la source
mRecyclerView
à l'intérieur duAdapter
Une autre façon consiste à utiliser les
addOnChildAttachStateChangeListener
poignées des vues enfant apparaissant / disparaissant dansRecyclerView
.la source
Au cas où vous travaillez avec un FirebaseRecyclerAdapter, ce message fonctionne comme un charme https://stackoverflow.com/a/39058636/6507009
la source