RecyclerView développer/réduire les éléments
Je veux agrandir/réduire les éléments de mon recyclerView afin d'afficher plus d'informations. Je veux obtenir le même effet de la SlideExpandableListView.
En gros, dans mon viewHolder j'ai une vue qui n'est pas visible et je veux faire une lisse développer/réduire animation plutôt que de définir la visibilité VISIBLE/ALLÉ seulement. J'ai seulement besoin d'un élément à être élargie à un moment et ça serait cool d'avoir une certaine élévation de montrer que l'élément est sélectionné.
C'est le même effet de la nouvelle Android appels récents la liste de l'historique. Les options "CALL BACK" et "DÉTAILS" ne sont visibles que lorsqu'un élément est sélectionné.
- J'ai une question connexe. Dans l'application Horloge, alarme activité dispose d'une fonctionnalité similaire. Il est fait de la même façon?
- Hey, avez-vous la solution? je suis également à la recherche de la même solution pour mon application.
- Avez-vous trouvez une solution?
- J'ai mis à jour la meilleure façon de le faire selon Google I/O de 2016. Voir ma réponse stackoverflow.com/questions/27203817/...
- vérifier ma réponse ici simple et cool solution stackoverflow.com/a/48092441/5962715
InformationsquelleAutor stanete | 2014-11-29
Vous devez vous connecter pour publier un commentaire.
S'il vous plaît ne pas utiliser n'importe quelle bibliothèque pour cet effet, au lieu d'utiliser la méthode recommandée selon Google I/O. Dans votre recyclerView de onBindViewHolder méthode de faire cela:
Et pour la fraîcheur des effets que vous vouliez les utiliser comme votre list_item attributs:
où comment_background est:
et comment_selection est:
TransitionManager.beginDelayedTransition(recyclerView);
si je ne peux pas hace le recycleur vue de référence.recyclerView
comme un paramètre dans le constructeur de la cartePas dire que c'est la meilleure approche, mais il semble fonctionner pour moi.
Le code complet peut être trouvé à:
Exemple de code: https://github.com/dbleicher/recyclerview-grid-quickreturn
Tout d'abord, ajouter la zone d'extension à votre cellulaire/élément de mise en page, et de faire de l'affichage de la cellule de mise en page animateLayoutChanges="true". Cela permettra d'assurer que l'expand/collapse est animé:
Alors, faites de votre camping-car de classe d'Adaptateur de mettre en œuvre la Vue.OnClickListener de sorte que vous pouvez agir sur l'élément cliqué. Ajouter un champ int pour maintenir la position d'un point de vue élargi, et l'initialiser à une valeur négative:
Enfin, mettre en œuvre votre ViewHolder, onBindViewHolder() les méthodes et remplacer le onClick() la méthode. Vous développez la vue dans onBindViewHolder si la position est égale à "expandedPosition", et de le cacher dans le cas contraire. Vous définissez la valeur de expandedPosition dans le onClick auditeur:
Cela devrait élargir un seul élément à la fois, en utilisant le système d'animation par défaut pour le changement de présentation. Au moins, ça marche pour moi. Espérons que cela aide.
expandAlarm
fonction dansAlarmClockFragment.java
fichiers exécute l'expansion de la partie.onClick()
dois-je remplacer? Il n'y a pasonClick
dans l'Adaptateur.onClickListener
Pour cette, a juste besoin de lignes simples et pas compliquées
dans votre onBindViewHolder méthode ajouter le code ci-dessous
Pour ceux qui veulent seulement un élément étendu et les autres se sont effondrés. Utilisez cette
d'abord déclarer une variable globale avec previousExpandedPosition = -1
puis
Fait!!!!!. Simple et humble .. 🙂
OnClickListener
s àonCreateViewHolder
au lieu deonBindViewHolder
RecyclerView
faire le travail, je veux dire, quel est le point de laLayoutManager
sinon, si ce n'est pas de gérer les mises en page! Cette solution est meilleure que le haut voté solution car il y a moins de code, permet à l'RecyclerView
gérer les choses et fonctionne mieux!notifyItemChanged(position);
. Exactement ce que fait cette ligne de code à réaliser? Je suis un débutant, j'espère que vous n'avez pas l'esprit. MerciIl est très simple à utiliser bibliothèque avec gradle support: https://github.com/cachapa/ExpandableLayout.
Droit de la bibliothèque de docs:
Après vous marquez votre extensible vues, il suffit d'appeler l'une de ces méthodes sur le conteneur:
expand()
,collapse()
outoggle()
Il n'y a pas besoin d'utiliser des bibliothèques tierces. Un petite astuce dans la méthode présentée dans Google I/O de 2016 et Heisenberg sur ce sujet, fait le tour.
Depuis
notifyDataSetChanged()
retrace l'completRecyclerView
,notifyDataItemChanged()
est une meilleure option (pas le meilleur) parce que nous avons de la position et de laViewHolder
à notre disposition, etnotifyDataItemChanged()
seulement redessine le particulierViewHolder
à une position donnée.Mais le problème est que la disparition prématurée de la
ViewHolder
en cliquant et c'est l'émergence n'est pas éliminé, même sinotifyDataItemChanged()
est utilisé.Le code suivant ne pas recours à
notifyDataSetChanged()
ounotifyDataItemChanged()
et est Testé sur les API 23 et fonctionne comme un charme lorsqu'il est utilisé sur un RecyclerView où chaque ViewHolder a unCardView
que c'est l'élément racine:prev_position
est une mondial entier initialisé à -1.details
est la vue d'ensemble qui est indiqué lors de son expansion et masqué lorsque s'est effondré.Comme l'a dit, l'élément racine de
ViewHolder
est unCardView
avecforeground
etstateListAnimator
attributs définis exactement comme l'a dit par Heisenberg sur ce sujet.Mise à JOUR: La démonstration ci-dessus va s'effondrer previosuly élargi point si l'un d'entre eux dans l'élargissement. Pour modifier ce comportement et de garder le une expansion de l'élément tel qu'il est, même si un autre élément est développé, vous devrez utiliser le code suivant.
Mise à JOUR: Lors de l'expansion de la dernière éléments dans la liste, il peut ne pas être pleinement mises en visibilité, car l'élargissement de la partie passe en dessous de l'écran. Pour obtenir l'objet à l'intérieur de l'écran utilisez le code suivant.
IMPORTANT: Pour les démonstrations de travail, il faut garder à leur code d'une instance de la RecyclerView & c'est LayoutManager (le plus tard pour la flexibilité)
notifyItemChanged
parce que j'ai unImageView
qui charge une image depuis une url.notifyItemChanged
recharger mon image fait un peu bizarreTransitionManager.beginDelayedTransition(recycler);
, belle trouvaille. Mais j'ai découvert qu'en utilisant cette méthode, si je spam-cliquez sur plusieurs lignes de manière séquentielle, il finit par déclenche une interne crashThe specified child already has a parent. You must call removeView() on the child's parent first
. J'imagine que cela est dû à la vue du recyclage sur le recycleur vue de limites, mais je ne peux pas dire pour sûr. Quelqu'un a le même problème?Je sais qu'il a été un long temps depuis que la question initiale a été posté. Mais je pense que pour ralentir ceux comme moi un peu d'explication de @Heisenberg de la réponse de l'aide.
Déclarer deux variables dans la classe d'adaptateur comme
Puis dans onBindViewHolder suivantes comme indiqué dans la réponse originale à cette question.
Et enfin pour obtenir le recyclerView objet dans l'adaptateur remplacer
Espère que cette Aide.
Après l'utilisation de la méthode recommandée de mise en œuvre extensible/pliable éléments résidant dans un
RecyclerView
sur RecyclerView développer/réduire les éléments répondu par HeisenBerg, j'ai vu quelques notables artefacts chaque fois que leRecyclerView
est actualisé en invoquantTransitionManager.beginDelayedTransition(ViewGroup)
et par la suitenotifyDatasetChanged()
.Sa réponse originale à cette question:
Modifié:
int
qui conserve la trace d'une expansion de l'élémentViewHolder
utilisé lors de l'élément de l'effondrementAvis que la méthode
TransitionManager.beginDelayedTransition(ViewGroup)
etnotifyDataSetChanged()
sont remplacés parnotifyItemChanged(int)
à la cible spécifique de l'élément et quelques petits réglages.Après la modification, la précédente effets indésirables devraient avoir disparu. Toutefois, cela peut ne pas être la solution parfaite. Il ne faisait ce que je voulais, en éliminant les horreurs.
::EDIT::
Pour la clarification, à la fois
mExpandedPosition
etmExpandedHolder
sont globales.notifyItemChanged()
. Vous pouvez animer manuellement et de modifier la hauteur de l'article et ajout de vues en elle.Effectuez les opérations suivantes après avoir défini le onClick auditeur à la ViewHolder classe:
Je pense que cela devrait aider, c'est comment j'ai mis en place et fonctionne de la même google ne dans le récent appel de la vue.
Vous pouvez utiliser ExpandableLayout.
https://github.com/KyoSherlock/ExpandableLayout
Ce ExpandableLayout est comme une douceur de développer/réduire animation Case, de sorte qu'il peut être utilisé n'importe où (ListView ou RecyclerView).
Utiliser deux types d'affichage dans le votre
RVAdapter
. L'un pour l'expansion de mise en page et d'autres pour s'effondra.Et la magie se produit avec le réglage de
android:animateLayoutChanges="true"
pourRecyclerView
La caisse de l'effet obtenu à l'aide de ce à 0:42 dans cette vidéo