Comment une ligne de séparation peut-elle être ajoutée dans Android RecyclerView?

Je développe une application Android où j’utilise RecyclerView . Je dois append un séparateur dans RecyclerView . J’ai essayé d’append –

 recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); 

ci-dessous est mon code xml –

   

Le bon moyen est de définir ItemDecoration pour RecyclerView est comme suit

SimpleDividerItemDecoration.java

 public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public SimpleDividerItemDecoration(Context context) { mDivider = context.getResources().getDrawable(R.drawable.line_divider); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } 

line_divider.xml:

 < ?xml version="1.0" encoding="utf-8"?>     

Enfin définissez comme ça

 recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this)); 

modifier

Comme l'a souligné @Alan Solitar

 context.getResources().getDrawable(R.drawable.line_divider); 

est amorti au lieu de ce que vous pouvez utiliser

 ContextCompat.getDrawable(context,R.drawable.line_divider); 

Dans la mise à jour d’octobre 2016, la bibliothèque de support v25.0.0 dispose désormais d’une implémentation par défaut des diviseurs horizontaux et verticaux de base disponibles!

https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html

  recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL)); 

Si vous voulez avoir des séparateurs horizontaux et verticaux:

  1. Définissez les divisables horizontaux et verticaux:

    horizontal_divider.xml

     < ?xml version="1.0" encoding="utf-8"?>     

    vertical_divider.xml

     < ?xml version="1.0" encoding="utf-8"?>     
  2. Ajoutez ce segment de code ci-dessous:

     DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.HORIZONTAL); Drawable verticalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.vertical_divider); verticalDecoration.setDrawable(verticalDivider); recyclerview.addItemDecoration(verticalDecoration); DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.VERTICAL); Drawable horizontalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.horizontal_divider); horizontalDecoration.setDrawable(horizontalDivider); recyclerview.addItemDecoration(horizontalDecoration); 

Ajoutez simplement une vue à la fin de votre adaptateur d’élément:

  

Toutes ces réponses m’ont rapproché mais elles manquaient chacune un détail clé. Après quelques recherches, j’ai trouvé la voie la plus simple pour combiner ces trois étapes:

  1. Utilisez la bibliothèque de support DividerItemDecoration
  2. Créer un diviseur avec la bonne couleur
  3. Définissez ce diviseur dans votre thème comme listeDivider

Étape 1: lors de la configuration de RecyclerView

 recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation())); 

Etape 2: dans un fichier comme res / drawable / divider_gray.xml

 < ?xml version="1.0" encoding="utf-8"?>     

Étape 3: dans le thème de l’application

  

EDIT: mis à jour pour ignorer le dernier diviseur:
Après l’avoir utilisé un peu, j’ai réalisé qu’il dessinait un séparateur après le dernier élément, ce qui était agaçant. J’ai donc modifié l’ étape 1 comme suit pour remplacer ce comportement par défaut dans DividerItemDecoration (bien sûr, créer une classe séparée est une autre option):

 recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation())) { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // hide the divider for the last child if (position == parent.getAdapter().getItemCount() - 1) { outRect.setEmpty(); } else { super.getItemOffsets(outRect, view, parent, state); } } } ); 

Voici le code pour un simple séparateur personnalisé (diviseur vertical / hauteur 1dp / noir):

Il suppose que vous avez une bibliothèque de support:

 comstack "com.android.support:recyclerview-v7:25.1.1" 

code java

  DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider)); recyclerView.addItemDecoration(divider); 

puis l’exemple de fichier custom_divider.xml:

 < ?xml version="1.0" encoding="utf-8"?>     

Je pense que vous utilisez des Fragments pour avoir RecyclerView

Ajoutez simplement ces lignes après avoir créé vos objects RecyclerView et LayoutManager

 DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); recyclerView.addItemDecoration(dividerItemDecoration); 

C’est tout!

Il supporte les orientations HORIZONTALES et VERTICALES.

Créer un fichier xml séparé dans le dossier res / drawable

  < ?xml version="1.0" encoding="utf-8"?>     

Connectez ce fichier xml (votre_fichier) à l’ activité principale , comme ceci:

 DividerItemDecoration divider = new DividerItemDecoration( recyclerView.getContext(), DividerItemDecoration.VERTICAL ); divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file)); recyclerView.addItemDecoration(divider); 

Donc, ce n’est peut-être pas la bonne manière, mais j’ai simplement ajouté une vue à la vue d’élément unique de recyclerView (car je ne pense pas qu’il y ait une fonction intégrée) comme ceci:

  

Cela signifie que chaque article aura une ligne qui le remplit en bas. Je l’ai fait à environ 1dp de haut avec un fond # 111111. Cela lui donne aussi une sorte d’effet “3D”.

Vous devez append la prochaine ligne …

 mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); 

Vous pouvez créer un diviseur simple réutilisable.

Créer un diviseur:

 public class DividerItemDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecorator(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { int dividerLeft = parent.getPaddingLeft(); int dividerRight = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int dividerTop = child.getBottom() + params.bottomMargin; int dividerBottom = dividerTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); mDivider.draw(canvas); } } } 

Créer une ligne de séparation: divider.xml

 < ?xml version="1.0" encoding="utf-8"?>     

Ajouter un séparateur à votre Recyclerview:

 RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider)); recyclerView.addItemDecoration(dividerItemDecoration); 

Pour supprimer un séparateur pour le dernier élément:

Pour empêcher le dessin du diviseur pour le dernier élément, vous devez modifier cette ligne.

 for (int i = 0; i < childCount; i++) 

À

 for (int i = 0; i < childCount-1; i++) 

Votre implémentation finale devrait être comme ceci:

 public class DividerItemDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecorator(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { int dividerLeft = parent.getPaddingLeft(); int dividerRight = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int dividerTop = child.getBottom() + params.bottomMargin; int dividerBottom = dividerTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); mDivider.draw(canvas); } } } 

J'espère que cela aide:)

RecyclerView-FlexibleDivider de yqritc en fait une doublure. Ajoutez d’abord ceci à votre build.gradle :

 comstack 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter() 

Maintenant, vous pouvez configurer et append un séparateur où vous définissez l’adaptateur de votre recyclerView:

 recyclerView.setAdapter(myAdapter); recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).color(Color.RED).sizeResId(R.dimen.divider).marginResId(R.dimen.leftmargin, R.dimen.rightmargin).build()); 

Essayez ce code simple simple

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL));

Pour rendre la réponse de NJ un peu plus simple, vous pouvez faire:

 public class DividerColorItemDecoration extends DividerItemDecoration { public DividerColorItemDecoration(Context context, int orientation) { super(context, orientation); setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider)); } } 

Android ne fait que rendre les petites choses trop compliquées malheureusement. La manière la plus simple de réaliser ce que vous voulez sans implémenter DividerItemDecoration ici:

Ajoutez la couleur d’arrière-plan au RecyclerView à la couleur de séparation souhaitée:

  

Ajoutez la marge inférieure (android: layout_marginBottom) à la racine de mise en page de l’élément (list_item.xml):

     

Cela devrait donner 1dp d’espace entre les éléments et la couleur d’arrière-plan de RecyclerView (qui est gris foncé apparaîtrait comme un diviseur).

Ajoutez simplement une marge de x au bas d’un élément de votre RecycleView Adapter .

onCreateViewHolder

 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(0, 0, 0, 5); itemView.setLayoutParams(layoutParams); 
 recyclerview.addItemDecoration(new DividerItemDecoration(this, 0)); 

0 est Horizontal et 1 est Véritable