Je développe une application Android où j'utilise RecyclerView
. J'ai besoin d'ajouter un diviseur dans RecyclerView
. J'ai essayé d'ajouter -
recyclerView.addItemDecoration(new
DividerItemDecoration(getActivity(),
DividerItemDecoration.VERTICAL_LIST));
ci-dessous est mon code xml -
<Android.support.v7.widget.RecyclerView
Android:id="@+id/drawerList"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="15dp"
/>
Dans la mise à jour d'octobre 2016, la bibliothèque de support v25.0.0 propose désormais une implémentation par défaut des séparateurs horizontaux et verticaux de base!
https://developer.Android.com/reference/Android/support/v7/widget/DividerItemDecoration.html
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
La bonne façon est de définir ItemDecoration
pour le 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"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<size
Android:width="1dp"
Android:height="1dp" />
<solid Android:color="@color/dark_gray" />
</shape>
Enfin définissez comme ça
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
Comme l'a souligné @Alan Solitar
context.getResources().getDrawable(R.drawable.line_divider);
est déprécié au lieu de cela, vous pouvez utiliser
ContextCompat.getDrawable(context,R.drawable.line_divider);
Si vous souhaitez avoir des séparateurs horizontaux et verticaux:
Définir les tiroirs séparateurs horizontaux et verticaux:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<size Android:height="1dip" />
<solid Android:color="#22000000" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<size Android:width="1dip" />
<solid Android:color="#22000000" />
</shape>
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:
<View
Android:layout_width="match_parent"
Android:layout_height="1px"
Android:background="#FFFFFF"/>
PDATE:
Pour de meilleurs résultats, convertissez 1px
en 1dp
:
<View
Android:layout_width="match_parent"
Android:layout_height="1dp"
Android:background="#FFFFFF"/>
Toutes ces réponses m'ont rapproché, mais il leur manquait un détail clé. Après quelques recherches, j'ai trouvé le meilleur moyen de combiner ces 3 étapes:
Étape 1: lors de la configuration de RecyclerView
recyclerView.addItemDecoration(
new DividerItemDecoration(context, layoutManager.getOrientation()));
Étape 2: dans un fichier tel que res/drawable/divider_gray.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<size Android:width="1px" Android:height="1px" />
<solid Android:color="@color/gray" />
</shape>
Étape 3: dans le thème de l'application
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Other theme items above -->
<item name="Android:listDivider">@drawable/divider_gray</item>
</style>
EDIT: Mise à jour pour ignorer le dernier séparateur:
Après avoir utilisé cela un peu, j’ai réalisé que c’était un tirage au sort 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, la création d'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 diviseur personnalisé simple (diviseur vertical/hauteur 1dp/noir):
Cela suppose que vous ayez la bibliothèque de support:
compile "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"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle">
<size Android:height="1dp" />
<solid Android:color="@Android:color/black" />
</shape>
Je pense que vous utilisez Fragments
pour avoir RecyclerView
Ajoutez simplement ces lignes après avoir créé vos objets RecyclerView
et LayoutManager
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
C'est ça!
Il prend en charge les orientations HORIZONTAL et VERTICAL.
Créez un fichier XML séparé dans le dossier res/drawable
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle">
<size Android:height="1dp" />
<solid Android:color="@Android:color/black" />
</shape>
Connectez ce fichier XML (votre_fichier) à la activité principale, comme ceci:
DividerItemDecoration divider = new DividerItemDecoration(
recyclerView.getContext(),
DividerItemDecoration.VERTICAL
);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file));
recyclerView.addItemDecoration(divider);
Essayez ce code simple en une seule ligne
recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL));
Version Kotlin:
recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
Donc, ce n'est peut-être pas la bonne façon, mais j'ai simplement ajouté une vue à la vue d'un seul article de RecyclerView (car je ne pense pas qu'il existe une fonction intégrée) comme ceci:
<View
Android:layout_width="fill_parent"
Android:layout_height="@dimen/activity_divider_line_margin"
Android:layout_alignParentBottom="true"
Android:background="@color/tasklist_menu_dividerline_grey" />
Cela signifie que chaque élément aura une ligne qui le remplira en bas. Je l'ai fait environ 1dp haut avec un fond #111111
. Cela lui donne aussi une sorte d'effet "3D".
Vous devez ajouter la ligne suivante ...
mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
Vous pouvez créer un simple diviseur réutilisable.
Créer un séparateur:
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"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<size
Android:width="1dp"
Android:height="1dp" />
<solid Android:color="@color/grey_300" />
</shape>
Ajouter un séparateur à votre liste de recyclage:
RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider));
recyclerView.addItemDecoration(dividerItemDecoration);
Supprimer le séparateur pour le dernier élément:
Pour éviter que le diviseur ne dessine 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 ça aide:)
le yqritc RecyclerView-FlexibleDivider en fait une doublure. Ajoutez d'abord ceci à votre build.gradle
:
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter()
Vous pouvez maintenant configurer et ajouter un divder à l'endroit où vous définissez l'adaptateur de 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());
Android rend les petites choses trop compliquées malheureusement. Le moyen le plus simple de réaliser ce que vous voulez, sans implémenter DividerItemDecoration ici:
Ajouter la couleur de fond à RecyclerView à la couleur de séparation souhaitée:
<RecyclerView
Android:id="@+id/rvList"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:divider="@color/colorLightGray"
Android:scrollbars="vertical"
tools:listitem="@layout/list_item"
Android:background="@Android:color/darker_gray"/>
Ajouter la marge inférieure (Android: layout_marginBottom) à la racine de la disposition de l'élément (list_item.xml):
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_marginBottom="1dp">
<TextView
Android:id="@+id/tvName"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="John Doe" />
<TextView
Android:id="@+id/tvDescription"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/tvName"
Android:text="Some description blah blah" />
</RelativeLayout>
Cela devrait donner un espace de 1dp entre les éléments et la couleur d’arrière-plan de RecyclerView (le gris foncé apparaîtra comme un diviseur).
Pour simplifier un peu la réponse de JJ, 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));
}
}
Ajoutez simplement une marge de x montant 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));
Où 0
est horizontal et 1
est vertical