Je souhaite développer / réduire les éléments de mon recyclerView afin d'afficher plus d'informations. Je veux obtenir le même effet de la SlideExpandableListView .
Fondamentalement, dans mon viewHolder, j'ai une vue qui n'est pas visible et je veux faire une animation de développement / réduction fluide plutôt que de définir la visibilité sur VISIBLE / GONE uniquement. Je n'ai besoin que d'un élément à développer à la fois et ce serait cool d'avoir une certaine élévation pour montrer que l'élément est sélectionné.
C'est le même effet de la nouvelle liste d'historique des appels récents Android. Les options «RAPPEL» et «DÉTAILS» ne sont visibles que lorsqu'un élément est sélectionné.
Réponses:
Veuillez n'utiliser aucune bibliothèque pour cet effet à la place, utilisez la méthode recommandée pour le faire selon Google I / O. Dans la méthode onBindViewHolder de votre recyclerView, procédez comme suit :
Et pour les effets sympas que vous vouliez, utilisez-les comme attributs list_item:
où comment_background est:
et comment_selection est:
la source
TransitionManager.beginDelayedTransition(recyclerView);
si je ne peux pas avoir la référence de vue de recycleur.recyclerView
tant que paramètre dans le constructeur de l'adaptateurPour cela, juste besoin de lignes simples pas compliquées
dans votre méthode onBindViewHolder, ajoutez le code ci-dessous
Pour ceux qui veulent qu'un seul élément soit développé et que les autres soient réduits. Utilisez ceci
déclarez d'abord une variable globale avec previousExpandedPosition = -1
puis
Terminé!!!. Simple et humble .. :)
la source
OnClickListener
auonCreateViewHolder
lieu deonBindViewHolder
RecyclerView
faire le travail, je veux dire, à quoiLayoutManager
sert le sinon si elle ne gère pas les mises en page! Cette solution est meilleure que la solution la plus votée car elle a moins de code, permet deRecyclerView
gérer les choses et fonctionne mieux!Ne pas dire que c'est la meilleure approche, mais cela semble fonctionner pour moi.
Le code complet peut être trouvé à l' adresse : Exemple de code sur: https://github.com/dbleicher/recyclerview-grid-quickreturn
Tout d'abord, ajoutez la zone développée à votre disposition de cellule / élément et rendez la disposition de cellule englobante animateLayoutChanges = "true". Cela garantira que le développement / réduction est animé:
Ensuite, faites en sorte que votre classe RV Adapter implémente View.OnClickListener afin que vous puissiez agir sur l'élément sur lequel l'utilisateur clique. Ajoutez un champ int pour contenir la position de la vue développée et initialisez-la à une valeur négative:
Enfin, implémentez vos méthodes ViewHolder, onBindViewHolder () et remplacez la méthode onClick (). Vous développerez la vue dans onBindViewHolder si sa position est égale à "ExpandPosition", et vous la masquerez dans le cas contraire. Vous définissez la valeur de ExpandPosition dans l'écouteur onClick:
Cela ne devrait développer qu'un seul élément à la fois, en utilisant l'animation par défaut du système pour le changement de disposition. Au moins ça marche pour moi. J'espère que ça aide.
la source
expandAlarm
La fonction dans lesAlarmClockFragment.java
fichiers exécute la partie d'extension.onClick()
devrais-je remplacer? Il n'y a pasonClick
dans l'adaptateur.Il existe une bibliothèque très simple à utiliser avec le support de gradle: https://github.com/cachapa/ExpandableLayout .
Directement à partir de la documentation de la bibliothèque:
Une fois que vous marquez votre extensible vues, il suffit d' appeler une de ces méthodes sur le contenant:
expand()
,collapse()
outoggle()
la source
Je sais que cela fait longtemps que la question initiale a été publiée. Mais je pense que pour les lents comme moi, une explication de la réponse de @ Heisenberg serait utile.
Déclarez deux variables dans la classe d'adaptateur comme
Puis dans onBindViewHolder suivant comme indiqué dans la réponse d'origine.
Et enfin pour obtenir l'objet recyclerView dans le remplacement de l'adaptateur
J'espère que cela t'aides.
la source
Il n'est tout simplement pas nécessaire d'utiliser des bibliothèques tierces. Un petit tweak dans la méthode démontrée dans Google I / O 2016 et Heisenberg sur ce sujet, fait l'affaire.
Depuis
notifyDataSetChanged()
redessine le completRecyclerView
,notifyDataItemChanged()
est une meilleure option (pas la meilleure) car nous avons la position et leViewHolder
à notre disposition, etnotifyDataItemChanged()
seulement redessine le particulierViewHolder
à une position donnée .Mais le problème est que la disparition prématurée du
ViewHolder
clic et son émergence n'est pas éliminée même si ellenotifyDataItemChanged()
est utilisée.Le code suivant ne recourt pas à
notifyDataSetChanged()
ounotifyDataItemChanged()
et est testé sur l'API 23 et fonctionne comme un charme lorsqu'il est utilisé sur un RecyclerView où chaque ViewHolder a unCardView
élément racine:prev_position
est un entier global initialisé à -1.details
est la vue complète qui est affichée lorsqu'elle est développée et masquée lorsqu'elle est réduite.Comme dit, l'élément racine de
ViewHolder
est unCardView
avecforeground
et desstateListAnimator
attributs définis exactement comme l'a dit Heisenberg sur ce sujet.MISE À JOUR: La démonstration ci-dessus réduira l'élément déjà développé si l'un d'entre eux est développé. Pour modifier ce comportement et conserver un élément développé tel quel, même lorsqu'un autre élément est développé, vous aurez besoin du code suivant.
MISE À JOUR: Lorsque vous développez les derniers éléments de la liste, il se peut que la visibilité totale ne soit pas visible car la partie développée passe sous l'écran. Pour obtenir l'élément complet dans l'écran, utilisez le code suivant.
IMPORTANT: pour que les démonstrations ci-dessus fonctionnent, il faut conserver dans leur code une instance de RecyclerView et de son LayoutManager (le plus récent pour plus de flexibilité)
la source
notifyItemChanged
parce que j'ai uneImageView
image qui charge à partir d'une URL.notifyItemChanged
recharger mon image le rend bizarreTransitionManager.beginDelayedTransition(recycler);
excellente trouvaille. Mais j'ai découvert qu'en utilisant cette méthode, si je clique sur plusieurs lignes de manière séquentielle, cela déclenche finalement un crash interneThe specified child already has a parent. You must call removeView() on the child's parent first
. J'imagine que cela est dû au recyclage de la vue sur les limites de la vue des recycleurs, mais je ne peux pas le dire avec certitude. Quelqu'un a-t-il eu le même problème?Après avoir utilisé la méthode recommandée pour implémenter des éléments extensibles / réductibles résidant dans des éléments de développement / réduction
RecyclerView
sur RecyclerView auxquels HeisenBerg a répondu , j'ai vu des artefacts visibles chaque fois que leRecyclerView
est actualisé en appelantTransitionManager.beginDelayedTransition(ViewGroup)
et par la suitenotifyDatasetChanged()
.Sa réponse originale:
Modifié:
int
qui garde une trace de l'élément développéViewHolder
utilisé lors de la réduction de l' élémentNotez que la méthode
TransitionManager.beginDelayedTransition(ViewGroup)
etnotifyDataSetChanged()
sont remplacés parnotifyItemChanged(int)
pour cibler un élément spécifique et quelques petites modifications.Après la modification, les effets indésirables précédents devraient disparaître. Cependant, ce n'est peut-être pas la solution parfaite. Il n'a fait que ce que je voulais, éliminant les horreurs.
::ÉDITER::
Pour clarification, les deux
mExpandedPosition
etmExpandedHolder
sont globaux.la source
notifyItemChanged()
. Vous pouvez animer et modifier manuellement la hauteur de l'élément et y ajouter des vues.Procédez comme suit après avoir défini l'écouteur onClick sur la classe ViewHolder:
Je pense que cela devrait aider, c'est ainsi que j'ai mis en œuvre et fait la même chose que Google fait dans la vue des appels récents.
la source
Je suis surpris qu'il n'y ait pas encore de réponse concise, bien qu'une telle animation d'expansion / réduction soit très facile à réaliser avec seulement 2 lignes de code:
ensemble avec
Donc pour moi, les explications dans le lien ci-dessous étaient vraiment utiles: https://medium.com/@nikola.jakshic/how-to-expand-collapse-items-in-recyclerview-49a648a403a6
la source
la source
Utilisez deux types de vue dans votre
RVAdapter
. Un pour la mise en page étendue et un autre pour la mise en page réduite. Et la magie opère avec le réglageandroid:animateLayoutChanges="true"
deRecyclerView
Checkout l'effet obtenu en utilisant ceci à 0:42 dans cette vidéola source