Comment ajouter une ligne de séparation dans un Android RecyclerView?


221

Je développe une application Android sur laquelle j'utilise RecyclerView. Je dois 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"
    />

3
Je pense que cela vous aidera à stackoverflow.com/q/24618829/942224
Sanket Kachhela

Pour afficher le séparateur sans la dernière ligne, utilisez ceci
Kishan Solanki

Je pense que votre code est correct. Je ne vois aucun problème.
Rohit Rawat

Réponses:


282

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 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));

3
Salut merci pour l'information! Existe-t-il un moyen de supprimer le séparateur après le dernier élément? J'ai juste un CardView où la liste est implémentée et le diviseur + l'ombre de cardview en bas n'est pas bon!
Maxi

4
J'ai eu le même problème et l'ai résolu en étendant DividerItemDecoration et en remplaçant getItemOffsets, puis en appelant uniquement super si je ne suis pas sur le premier élément. if(parent.getChildAdapterPosition(view) == state.getItemCount() - 1)puis revenez, sinon appelez la superclasse ' getItemOffsets().
Robin

13
Au lieu de mLayoutManager.getOrientation(), j'ai utilisé DividerItemDecoration.VERTICALet cela a fonctionné, car mon RecyclerView est vertical.
Aaron Lelevier

2
existe-t-il un moyen de changer la couleur du séparateur en utilisant cette méthode intégrée?
j2emanue

1
@ V.Kalyuzhnyu @android:attr/listDividerdans le thème de l'application n'affiche pas de séparateur s'il s'agit d'une ressource de couleur, j'ai dû créer une forme dessinable avec ma couleur avec une hauteur fixe.
A. Ferrand

226

La bonne manière est de définir ItemDecorationle RecyclerViewest 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-le comme ceci

recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));

Éditer

Comme l'a souligné @Alan Solitar

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

est amorti au lieu de cela, vous pouvez utiliser

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

3
context.getResources (). getDrawable (R.drawable.line_divider) est désormais obsolète.
Alan

2
Aucun problème. C'est une bonne réponse et cela a parfaitement fonctionné pour moi. Je vous remercie.
Alan

3
Cela fonctionne parfaitement de mon côté. Cependant, je me demande pourquoi ne pas ajouter une simple <View> pour ce séparateur dans la disposition de chaque cellule? C'est beaucoup moins de code. Cette solution est-elle moins performante en termes de performances? tx
Greg

4
Un problème avec cette implémentation se pose si vous essayez de glisser ou de déplacer des éléments.
TerNovi

1
@NJ Merci mec, tu m'as fait gagner du temps.
Suhas Bachewar

40

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

  1. Définissez les tiroirs du diviseur horizontal et vertical:

    horizontal_divider.xml

    <?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>

    vertical_divider.xml

    <?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>
  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);

Ça a marché. Mais si vous changez horizontal_divider.xml pour diviser la largeur et vertical_divider.xml pour diviser la hauteur, vous pouvez créer chacun DividerItemDecorationcomme ceci: verticalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.VERTICAL);et horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.HORIZONTAL);.
Ruben O. Chiavone

33

Toutes ces réponses m'ont rapproché mais il leur manquait un détail clé. Après un peu de recherche, j'ai trouvé que le chemin le plus simple était une combinaison de ces 3 étapes:

  1. Utilisez DividerItemDecoration de la bibliothèque de support
  2. Créez un séparateur avec la bonne couleur
  3. Définissez ce séparateur dans votre thème en tant que liste

Étape 1: lors de la configuration de RecyclerView

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

Étape 2: dans un fichier comme 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: Mis à jour pour ignorer le dernier séparateur:
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 ennuyeux. 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 distincte 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);
                }
            }
        }
);

7
Remplacer getItemOffsets ne semble pas fonctionner pour moi. Même si je remplace et n'appelle jamais super, le séparateur est toujours dessiné. Je ne sais pas ce qui a changé.
lostintranslation

2
Ça ne marche pas non plus pour moi. Le dernier séparateur toujours visible.
Sotti

1
J'ai fini par créer ma propre classe de diviseur en copiant la source de DividerItemDecoration et en changeant un peu pour ne pas dessiner le dernier diviseur. Dans la méthode de dessin, ignorez simplement la dernière vue enfant: for (int i = 0; i < childCount; i++)for (int i = 0; i < childCount - 1; i++)
passez

Étant donné que ItemDecoration est dessiné avant l'élément de liste ("sous" l'élément de liste), la solution donnée ne fonctionne que si votre élément de liste a un arrière-plan 100% opaque, ou lorsque la décoration pouvant être dessinée est 100% transparente (de sorte que l'utilisateur voit l'arrière-plan de recyclerView). Sinon, le séparateur est visible, peu importe ce que vous retournez dans getItemOffsets ()
ernazm

31

Ajoutez simplement une vue à la fin de votre adaptateur d'article:

<View
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:background="#FFFFFF"/>

25
Avec cette solution, vous obtiendrez également la ligne de séparation à la fin de la liste.
Arià

5
La dernière ligne peut être supprimée par programme en disant quelque chose comme ça dans onBindViewHolder if(position == getItemCount() - 1) { mDividerView.setVisibility(View.INVISIBLE) }Ou il doit y avoir d'autres façons de le faire.
Ali Kazi

la plupart du temps, la dernière ligne avec 1pxde la hauteur, est invisible à nos yeux
Mehdi Khademloo

@LucasDiego Cela fonctionnera mais nous savons que le gonflage coûte cher.
Zohra Khan

21

Voici le code d'un diviseur personnalisé simple (diviseur vertical / hauteur 1dp / noir):

Cela suppose que vous ayez une 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>

10

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) à 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);

Comment ajouter un rembourrage? L'utilisation du rembourrage en forme ne fonctionne pas.
Makalele

9

Version de Kotlin:

recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))

8

Je pense que vous utilisez Fragmentspour avoirRecyclerView

Ajoutez simplement ces lignes après avoir créé vos objets RecyclerViewetLayoutManager

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

C'est tout!

Il prend en charge les orientations HORIZONTALES et VERTICALES.


8

Essayez ce code simple sur une seule ligne

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

7

Vous devez ajouter la ligne suivante ...

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

7

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:

RecyclerViewExtension.kt

et ajoutez la setDividerméthode d'extension dans le fichier RecyclerViewExtension.kt.

/*
* RecyclerViewExtension.kt
* */
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView


fun RecyclerView.setDivider(@DrawableRes drawableRes: Int) {
    val divider = DividerItemDecoration(
        this.context,
        DividerItemDecoration.VERTICAL
    )
    val drawable = ContextCompat.getDrawable(
        this.context,
        drawableRes
    )
    drawable?.let {
        divider.setDrawable(it)
        addItemDecoration(divider)
    }
}

2.

Créez un fichier de ressources Drawable à l'intérieur du drawablepackage comme recycler_view_divider.xml:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="10dp"
    android:insetRight="10dp">

    <shape>
        <size android:height="0.5dp" />
        <solid android:color="@android:color/darker_gray" />
    </shape>

</inset>

où vous pouvez spécifier la marge gauche et droite sur android:insetLeftet android:insetRight.

3.

Sur votre activité ou fragment où le RecyclerView est initialisé, vous pouvez définir le dessin personnalisé en appelant:

recyclerView.setDivider(R.drawable.recycler_view_divider)

4.

Vive 🍺

Rangée RecyclerView avec séparateur.


6

Donc, ce n'est peut-être pas la bonne façon, mais je viens d'ajouter une vue à la vue d'un seul élément de RecyclerView (car je ne pense pas qu'il y ait 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 de haut avec un #111111arrière - plan. Cela lui donne également une sorte d'effet "3D".


2
- ce n'est pas un moyen
Anand Tiwari

5

Vous pouvez créer un simple séparateur 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>

Ajoutez un séparateur à votre Recyclerview:

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

Pour supprimer le séparateur du dernier élément:

Pour empêcher le dessin du séparateur 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:)


1
Cela fonctionne parfaitement, je ne sais pas pourquoi ce n'est pas la réponse acceptée
Kennedy Kambo

2

RecyclerView-FlexibleDivider de yqritc 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 diviseur 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());

16
@Gaurav, où se trouve la HorizontalDividerItemDecorationclasse?
iRuth

@iRuth, vous devez ajouter la bibliothèque maven dans votre fichier .gradle github.com/yqritc/RecyclerView-FlexibleDivider
Hakem Zaied

5
Ceci est une réponse incomplète. Peut-être qu'un vote à la baisse est approprié.
Week

Il est bon de mentionner que la bibliothèque de la 3ème partie est requise pour cela @ gaurav-vachhani
Andrew V.

2

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:

Ajoutez une couleur d'arrière-plan à 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"/>

Ajoutez la marge inférieure (android: layout_marginBottom) à la racine de mise en page 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 (qui est gris foncé apparaîtra comme séparateur).


1

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));
    }
}

1

Ajoutez simplement une marge de x au bas d'un article dans 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);

1
recyclerview.addItemDecoration(new DividerItemDecoration(this, 0));

0est Horizontale et 1Veritique


3
mieux utiliser la variable constante car la valeur pourrait changer lors de la prochaine version de la bibliothèque de support
Irshu

true .. nous devrions utiliser LinearLayoutManager.HORIZONTAL ou LinearLayoutManager.VERTICAL au lieu de 0 ou 1
Freny Christian

0
  class ItemOffsetDecoration(
        context: Context,
        private val paddingLeft: Int,
        private val paddingRight: Int
    ) : RecyclerView.ItemDecoration() {
        private var mDivider: Drawable? = null

        init {
            mDivider = ContextCompat.getDrawable(context, R.drawable.divider_medium)
        }

        override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
            val left = parent.paddingLeft + paddingLeft
            val right = parent.width - parent.paddingRight - paddingRight
            val childCount = parent.childCount
            for (i in 0 until childCount) {
                val child = parent.getChildAt(i)
                val params = child.layoutParams as RecyclerView.LayoutParams
                val top = child.bottom + params.bottomMargin
                val bottom = top + (mDivider?.intrinsicHeight ?: 0)

                mDivider?.let {
                    it.setBounds(left, top, right, bottom)
                    it.draw(c)
                }
            }
        }
    }

Il vous suffit de spécifier une couleur dans R.drawable.divider_medium

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/black" />
    <size
        android:height="1dp"
        android:width="1dp" />

</shape>

et ajoutez-le à votre recycleur

recyclerView.addItemDecoration(
                        ItemOffsetDecoration(
                            this,
                            resources.getDimension(resources.getDimension(R.dimen.dp_70).roundToInt()).roundToInt(),
                            0
                        )
                    )

refernce this


0

La solution Bhuvanesh BS fonctionne. Version Kotlin de ceci:

import android.graphics.Canvas
import android.graphics.drawable.Drawable
import androidx.recyclerview.widget.RecyclerView

class DividerItemDecorator(private val mDivider: Drawable?) : RecyclerView.ItemDecoration() {

    override fun onDraw(
        canvas: Canvas,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {

        val dividerLeft = parent.paddingLeft
        val dividerRight = parent.width - parent.paddingRight
        for (i in 0 until parent.childCount - 1) {
            val child = parent.getChildAt(i)
            val dividerTop =
                child.bottom + (child.layoutParams as RecyclerView.LayoutParams).bottomMargin
            val dividerBottom = dividerTop + mDivider!!.intrinsicHeight
            mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom)
            mDivider.draw(canvas)
        }
    }
}

0

Je pense que c'est le moyen le plus simple

mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
                DividerItemDecoration.VERTICAL);
// or DividerItemDecoration.HORIZONTALL
        mDividerItemDecoration.setDrawable(getDrawable(R.drawable.myshape));
        recyclerView.addItemDecoration(mDividerItemDecoration);

Notez que: myshape peut être rectangulaire avec la hauteur que vous voulez faire de votre diviseur

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.