Voici un exemple de la façon dont cela aurait pu être fait précédemment dans la ListView
classe, en utilisant les paramètres divider et dividerHeight :
<ListView
android:id="@+id/activity_home_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="8dp"/>
Cependant, je ne vois pas une telle possibilité dans la RecyclerView
classe.
<android.support.v7.widget.RecyclerView
android:id="@+id/activity_home_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
Dans ce cas, est-il correct de définir des marges et / ou d'ajouter une vue de séparation personnalisée directement dans la mise en page d'un élément de liste ou existe-t-il un meilleur moyen d'atteindre mon objectif?
com.homeretailgroup.argos.android.view.decorators.DividerItemDecoration
et utilisez-la comme ça:mRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
Réponses:
Mise à jour d'octobre 2016
La version 25.0.0 d'Android Support Library a introduit la
DividerItemDecoration
classe:Usage:
Réponse précédente
Certaines réponses utilisent des méthodes qui sont devenues obsolètes depuis, ou ne donnent pas de solution complète, j'ai donc essayé de faire un bref résumé à jour.
Contrairement à
ListView
, laRecyclerView
classe n'a pas de paramètres liés au diviseur. , Vous avez besoin au lieu d'étendreItemDecoration
, uneRecyclerView
classe interne de »:Vertical
espacementItemDecoration
Étendez
ItemDecoration
, ajoutez un constructeur personnalisé qui prend de l'espaceheight
comme paramètre et remplacez lagetItemOffsets()
méthode:Si vous ne souhaitez pas insérer d'espace sous le dernier élément, ajoutez la condition suivante:
Remarque: vous pouvez également modifier
outRect.top
,outRect.left
etoutRect.right
propriétés pour effet désiré.Séparateur
ItemDecoration
Étendre
ItemDecoration
et remplacer laonDraw()
méthode:Vous pouvez soit appeler le premier constructeur qui utilise les attributs du diviseur Android par défaut, ou le second qui utilise votre propre dessinable, par exemple drawable / divider.xml
Remarque: si vous souhaitez que le séparateur soit tracé sur vos éléments, remplacez
onDrawOver()
plutôt la méthode.Usage
Pour utiliser votre nouvelle classe, ajoutez
VerticalSpaceItemDecoration
ouDividerSpaceItemDecoration
àRecyclerView
, par exemple dans laonCreateView()
méthode de votre fragment :Il y a aussi la bibliothèque de Lucas Rocha qui est censée simplifier le processus de décoration des objets. Je n'ai pas encore essayé.
Parmi ses caractéristiques :
la source
onDraw()
. Je fais simplement référence à des instances déjà existantes.canvas.drawLine(startX, startY, stopX, stopY, mPaint)
àonDrawOver
? Une différence de performance?Ajoutez simplement
Vous devrez peut-être également ajouter la dépendance
compile 'com.android.support:recyclerview-v7:27.1.0'
ÉDITER:
Pour le personnaliser un peu, vous pouvez ajouter un dessin personnalisé:
Vous êtes libre d'utiliser tout dessin personnalisé, par exemple:
la source
Configuration
pour le diviseur vertical:if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
Puis-je attirer votre attention sur ce fichier particulier sur Github par Alex Fu: https://gist.github.com/alexfu/0f464fc3742f134ccd1e
Il s'agit du fichier d'exemple DividerItemDecoration.java "tiré directement des démos de support". ( Https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS )
J'ai pu obtenir des lignes de séparation bien après avoir importé ce fichier dans mon projet et l'ajouter comme décoration d'élément à la vue du recycleur.
Voici à quoi ressemble mon onCreateView dans mon fragment contenant le Recyclerview:
Je suis sûr qu'un style supplémentaire peut être fait, mais c'est un point de départ. :)
la source
Implémentation simple
ItemDecoration
pour des espaces égaux entre tous les éléments.la source
getChildPosition
est désormais obsolète,getChildAdapterPosition
peut être utilisé à la place.super.getItemOffsets
, sinon vos décalages seront écrasés.getChildLayoutPosition
être utilisé?La plus simple consiste à définir la couleur d'arrière-plan pour RecyclerView et une couleur d'arrière-plan différente pour les articles. Voici un exemple ...
et l' élément TextView (cela peut être n'importe quoi) avec une marge inférieure "x" dp ou px.
Le résultat ...
la source
Je pense que l'utilisation d'un simple séparateur vous aidera
à ajouter un séparateur à chaque élément:
1- Ajoutez ceci au répertoire dessinable line_divider.xml
2- Créer la classe SimpleDividerItemDecoration
J'ai utilisé cet exemple pour définir cette classe:
https://gist.github.com/polbins/e37206fbc444207c0e92
3- Dans l'activité ou le fragment qui utilise RecyclerView, dans onCreateView, ajoutez ceci:
4- Pour ajouter un espacement entre les articles, il
vous suffit d'ajouter une propriété de remplissage à la vue de votre article
la source
Comme je l'ai fixé
ItemAnimators
. leItemDecorator
ne tombiez pas ou sortie , ainsi que l'animation.J'ai simplement fini par avoir une ligne de vue dans mon fichier de disposition de vue d'élément de chaque élément. Cela a résolu mon cas.
DividerItemDecoration
senti trop de sorcellerie pour un simple diviseur.la source
C'est simple, vous n'avez pas besoin d'un code aussi compliqué
Ajoutez ceci dans votre dessinable: line_divider.xml
la source
Puisqu'il n'y a pas de bonne façon de l'implémenter correctement en utilisant Material Design, je viens de faire l'astuce suivante pour ajouter directement un séparateur sur l'élément de liste:
la source
La façon dont je gère la vue Divider et également les insertions Divider consiste à ajouter une extension RecyclerView.
1.
Ajoutez un nouveau fichier d'extension en nommant View ou RecyclerView:
et ajoutez la
setDivider
méthode d'extension dans le fichier RecyclerViewExtension.kt.2.
Créez un fichier de ressources Drawable à l'intérieur du
drawable
package commerecycler_view_divider.xml
:où vous pouvez spécifier la marge gauche et droite sur
android:insetLeft
etandroid:insetRight
.3.
Sur votre activité ou fragment où le RecyclerView est initialisé, vous pouvez définir le dessin personnalisé en appelant:
4.
Vive 🍺
la source
Si quelqu'un cherche à ajouter, disons, un espacement de 10dp entre les éléments, vous pouvez le faire en définissant un dessinable sur
DividerItemDecoration
:Où se
divider_10dp
trouve une ressource tirable contenant:la source
MISE À JOUR D'OCTOBRE 2016
Avec la bibliothèque de support v25.0.0, une implémentation par défaut des séparateurs horizontaux et verticaux de base est enfin disponible!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
la source
Cela ne résout pas réellement le problème, mais comme solution de contournement temporaire, vous pouvez définir la propriété useCompatPadding sur la carte dans votre disposition XML pour la faire mesurer de la même manière que sur les versions pré-Lollipop.
la source
Pour ceux qui recherchent juste des espaces entre les articles dans le
RecyclerView
voir mon approche où vous obtenez des espaces égaux entre tous les articles, sauf dans le premier et le dernier articles où j'ai donné un plus grand rembourrage. J'applique uniquement le rembourrage à gauche / droite en horizontalLayoutManager
et en haut / bas en verticalLayoutManager
.dimens.xml
la source
Ajoutez une marge à votre vue, cela a fonctionné pour moi.
Si vous souhaitez simplement ajouter un espacement égal et le faire en XML , définissez simplement
padding
votreRecyclerView
et une quantité égale delayoutMargin
l'élément que vous gonflez dans votreRecyclerView
, et laissez la couleur d'arrière-plan déterminer la couleur d'espacement.la source
overscroll
effet lors du tirage à la fin de la liste aura un remplissage inutile qui lui sera appliqué lors du remplissageRecyclerView
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" card_view:cardElevation="4dp" <!-- your item's XML here --> </android.support.v7.widget.CardView>
Ajoutez simplement un arrière-plan à la disposition de votre article de recyclage comme suit
Créer le shape_border.xml suivant dans le dossier dessinable
Voici le résultat final - un RecyclerView avec diviseur.
la source
parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1
devrait probablementparent.getChildAdapterPosition(view) > 0
avec deoutRect.bottom = mVerticalSpaceHeight
plus en plus ,outRect.top = mVerticalSpaceHeight
il devrait être la réponse acceptée.J'ai bifurqué le DividerItemDecoration à partir d'un ancien contenu et l'ai simplifié pour l'adapter à mon cas d'utilisation, et je l'ai également modifié pour dessiner les séparateurs comme ils sont dessinés dans ListView, y compris un séparateur après le dernier élément de la liste. Cela gérera également les animations verticales ItemAnimator:
1) Ajoutez cette classe à votre projet:
2) Ajoutez le décorateur à votre RecylerView:
la source
Au lieu de créer un
shape xml
pour changer la hauteur et la couleur du séparateur. Vous pouvez créer par programmation commela source
Tiré d'une recherche google, ajoutez cet articleDécoration à votre
RecyclerView
:la source
Ce lien a fonctionné comme un charme pour moi:
https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36
Puis dans votre activité:
Ou ceci si vous utilisez un fragment:
la source
mShowFirstDivider = false
,mShowLastDivider = true
mais ça ne marchera pas. Une idée pourquoi?Nous pouvons décorer les articles à l'aide de divers décorateurs attachés à la vue de recyclage tels que le DividerItemDecoration:
Utilisez simplement ce qui suit ... extrait de la réponse d' EyesClear
} puis utilisez ce qui précède comme suit
Cela affichera des séparateurs entre chaque élément de la liste, comme indiqué ci-dessous:
Et pour ceux qui recherchent plus de détails, consultez ce guide Utilisation de RecyclerView _ CodePath Android Cliffnotes
Certaines réponses suggèrent ici l'utilisation de marges, mais le problème est que: si vous ajoutez des marges supérieure et inférieure, elles apparaîtront toutes deux ajoutées entre les éléments et elles seront trop grandes. Si vous ajoutez seulement l'un ou l'autre, il n'y aura aucune marge ni en haut ni en bas de toute la liste. Si vous ajoutez la moitié de la distance en haut, la moitié en bas, les marges extérieures seront trop petites.
Ainsi, la seule solution esthétiquement correcte est le séparateur que le système sait où appliquer correctement: entre les articles mais pas au-dessus ou en dessous des articles.
Veuillez me faire part de vos doutes dans les commentaires ci-dessous :)
la source
DividerItemDecoration
ressemble le code.Trop tard mais pour
GridLayoutManager
moi j'utilise ceci:Ce travail pour tout nombre de travées que vous avez.
Ollie.
la source
FlexboxLayoutManager
?Vous pouvez ajouter facilement par programmation.
Si votre Layout Manager est Linearlayout, vous pouvez utiliser:
la source
la source
J'ai l'impression qu'il y a un besoin d'une réponse simple, basée sur du code qui n'utilise pas XML
la source
Si vous souhaitez ajouter le même espace pour les éléments, le moyen le plus simple consiste à ajouter un rembourrage supérieur + gauche pour RecycleView et des marges droite + inférieure aux éléments de la carte.
dimens.xml
list_item.xml
list.xml
la source
J'ai ajouté une ligne dans l'élément de liste comme ci-dessous
1px dessinera la ligne mince.
la source
Le
RecyclerView
est un peu différent duListView
. En fait, il aRecyclerView
besoin d'uneListView
structure similaire. Par exemple, aLinearLayout
. ALinearLayout
des paramètres pour diviser chaque élément. Dans le code ci-dessous, j'ai unRecyclerView
composé d'CardView
objets dans unLinearLayout
avec un "rembourrage" qui mettra un peu d'espace entre les éléments. Faites cet espace vraiment petit et vous obtenez une ligne.Voici la vue Recycler dans recyclerview_layout.xml
Et voici à quoi ressemble chaque élément (et il apparaît divisé en raison de l'androïde: remplissage dans le LinearLayout qui entoure tout.) Dans un autre fichier: cards_layout.xml
la source
Une solution vraiment simple consiste à utiliser RecyclerView-FlexibleDivider
Ajouter une dépendance:
Ajoutez à votre vue de recyclage:
Et tu as fini!
la source
1.L'un des moyens consiste à utiliser ensemble la vue de la vue de la carte et du recycleur, nous pouvons facilement ajouter un effet comme un diviseur. ex. https://developer.android.com/training/material/lists-cards.html
2.et l'autre consiste à ajouter la vue en tant que diviseur à list_item_layout de la vue du recycleur .
la source
Cela ajoutera de l'espace en haut et en bas de chaque élément (ou à gauche et à droite). Ensuite, vous pouvez le définir à votre
recyclerView
.SizeUtils.java
la source