74 votes

Marge entre les articles dans le recycleur voir Android

Salut, je suis la Suite de ce tutoriel

http://www.journaldev.com/10024/android-recyclerview-and-cardview-example-tutorial

Maintenant, je suis confronté à un étrange problème de la marge entre chaque cardview élément à l'intérieur de recycleur de vue est beaucoup trop.

QUESTION

Comment réduire la Marge entre chaque élément de cardview placé à l'intérieur de recycleur de vue.

enter image description here

115voto

Maher Nabil Points 878

J'ai rencontré un problème similaire, avec RelativeLayout en tant qu'élément racine pour chaque ligne de la vue recyclée.

Pour résoudre le problème, recherchez le fichier XML contenant chaque ligne et assurez-vous que la hauteur de l'élément racine est wrap_content NOT match_parent .

53voto

Victor Points 820

J'ai fait un cours pour gérer ce problème. Cette classe définit des marges différentes pour les éléments à l'intérieur de recyclerView: seule la première ligne aura une marge supérieure et seule la première colonne aura une marge gauche.

 public class RecyclerViewMargin extends RecyclerView.ItemDecoration {
private final int columns;
private int margin;

/**
 * constructor
 * @param margin desirable margin size in px between the views in the recyclerView
 * @param columns number of columns of the RecyclerView
 */
public RecyclerViewMargin(@IntRange(from=0)int margin ,@IntRange(from=0) int columns ) {
    this.margin = margin;
    this.columns=columns;

}

/**
 * Set different margins for the items inside the recyclerView: no top margin for the first row
 * and no left margin for the first column.
 */
@Override
public void getItemOffsets(Rect outRect, View view,
                           RecyclerView parent, RecyclerView.State state) {

    int position = parent.getChildLayoutPosition(view);
    //set right margin to all
    outRect.right = margin;
    //set bottom margin to all
    outRect.bottom = margin;
    //we only add top margin to the first row
    if (position <columns) {
        outRect.top = margin;
    }
    //add left margin only to the first column
    if(position%columns==0){
        outRect.left = margin;
    }
}
 

}

vous pouvez le définir dans votre recyclerview de cette façon

  RecyclerViewMargin decoration = new RecyclerViewMargin(itemMargin, numColumns);
 recyclerView.addItemDecoration(decoration);
 

45voto

Jing Points 635
  1. Recherchez l'attribut card_view:cardUseCompatPadding="true" dans cards_layout.xml et supprimez-le. Lancez l'application et vous constaterez qu'il n'y a pas de marge entre chaque élément de cardview.

  2. Ajoutez les attributs de marge que vous aimez. Ex:

     android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp" 
     

12voto

The Khaeng Points 21

Au lieu d'utiliser XML pour ajouter une marge entre les éléments de RecyclerView, c'est un meilleur moyen d'utiliser RecyclerView.ItemDecoration fourni par un cadre Android.

Donc, je crée une bibliothèque pour résoudre ce problème.

https://github.com/TheKhaeng/recycler-view-margin-decoration

entrez la description de l'image ici

10voto

Utilisez CardView dans la présentation d'éléments de Recyclerview comme ceci:

  <android.support.v7.widget.CardView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:card_view="http://schemas.android.com/tools"
        card_view:cardCornerRadius="10dp"
        app:cardBackgroundColor="#ACACAC"
        card_view:cardElevation="5dp"
        app:contentPadding="10dp"
        card_view:cardUseCompatPadding="true">
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X