web-dev-qa-db-fra.com

CardView à l'intérieur de RecyclerView a des marges supplémentaires

J'utilise un CardView comme élément dans un RecyclerView. Ce faisant Android génère automatiquement des marges entre le cardView et l'écran et entre les différents cardViews.

<Android.support.v7.widget.CardView 
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/galleryCardBGColor"
app:cardCornerRadius="2dp" >

<Android.support.v7.widget.RecyclerView
    Android:id="@+id/my_recycler_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:scrollbars="vertical" />

J'ai suivi les instructions du lien pour les intégrer dans mon projet: sing-recyclerview-and-cardview-in-Eclipse-adt

J'avais précédemment utilisé une disposition linéaire pour l'élément de liste:

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical" >

Cela fonctionnait parfaitement bien, sans aucune marge entre les éléments de la liste. Je viens de placer la disposition linéaire à l'intérieur du cardView, ce qui a entraîné des marges supplémentaires.

La raison étant que je veux fournir des marges exactes à ces éléments, et toutes les marges que je fournis maintenant sont ajoutées à ces marges préexistantes. J'ai essayé de fournir des marges/marges nulles/négatives à l'élément cardView, mais rien de tout cela ne fonctionne.

Toute idée, je peux supprimer ces marges ou autrement savoir exactement combien de marge est ajoutée.

32
vj9

avez-vous vérifié s'il s'agit de marge ou de remplissage? (Options de développement/afficher les limites de la disposition)

CardView ajoute un remplissage dans les plateformes pré-L pour dessiner des ombres. Dans L, sauf si vous définissez useCompatPadding=true, il ne doit pas y avoir d'écart.

L'ajout de marges négatives (bien que ce soit laid) devrait fonctionner. Si ce n'est pas le cas, veuillez ajouter un peu plus de code sur la façon dont vous les ajoutez et comment vous configurez le RecyclerView.

41
yigit

Ça a marché pour moi. Utilisation:

 card_view:cardElevation="0dp"
 card_view:cardMaxElevation="0dp"
44
Shubham

Juste décrit dans la réponse de @yigit, le CardView ajoutera un remplissage par défaut pour dessiner son ombre avant Android L. La taille du remplissage est décrite dans le doc de CardView.

J'ai trouvé que le moyen d'effacer ce remplissage (également pour ajouter du remplissage pour le contenu) consiste à utiliser les attributs contentPaddingLeft (/ Right/Top/Bottom) de CardView.

Si vous souhaitez effacer le remplissage par défaut, vous pouvez définir le contentPadding sur la valeur moins. Si vous souhaitez ajouter un remplissage de contenu, définissez contentPadding sur la valeur souhaitée.

Dans mon cas, j'utilise ces codes pour effacer le remplissage par défaut:

card_view:contentPaddingLeft="-3dp"
card_view:contentPaddingRight="-3dp"
card_view:contentPaddingTop="-3dp"
card_view:contentPaddingBottom="-3dp"

J'ai essayé la réponse de @Shubham, mais une exception IllegalStateException est levée dans RadialGradient.Java avec le message "le rayon doit être> 0".

18
Piasy

Utilisez ces deux balises ci-dessous:

card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
14

ajouter card_view:cardPreventCornerOverlap="false" à votre card Cela ne fonctionne que si votre image a des coins arrondis

4
Shayan_Aryan

Eh bien, il semble qu'il existe un moyen beaucoup plus facile de le faire, sans deviner le rembourrage et tout:

card_view:cardPreventCornerOverlap="false"

ou en utilisant Java:

cardView.setPreventCornerOverlap(false)
2
Ani kukadiya

Le commentaire de @ vj9 sous la question acceptée m'a aidé à calculer les décalages. Le partager ici, car cela pourrait aider quelqu'un d'autre:

public static int getVerticalCardViewOffset(Context context) {
    Resources res = context.getResources();
    int elevation = res.getDimensionPixelSize(R.dimen.cardview_default_elevation);
    int radius = res.getDimensionPixelSize(R.dimen.cardview_default_radius);
    return (int) (elevation * 1.5 + (1 - Math.cos(45)) * radius);
}

public static int getHorizontalCardViewOffset(Context context) {
    Resources res = context.getResources();
    int elevation = res.getDimensionPixelSize(R.dimen.cardview_default_elevation);
    int radius = res.getDimensionPixelSize(R.dimen.cardview_default_radius);
    return (int) (elevation + (1 - Math.cos(45)) * radius);
} 
1
Markus Rubey

utilisation

Android:adjustViewBounds="true"

sur la vue que vous voulez envelopper dans la vue de carte

0
Donbosco Muthiani

Si vous n'avez pas besoin du rayon d'angle ou de l'élévation du niveau inférieur, pensez à utiliser FrameLayout sur pré-Lollipop.

<include layout="@layout/card_view_compat" />

layout/card_view_compat

<merge
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    >
    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        >
        <include layout="@layout/content" />
    </FrameLayout>
</merge>

layout-v21/card_view_compat

<merge
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    >
    <Android.support.v7.widget.CardView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:cardCornerRadius="3dp"
        app:cardElevation="4dp"
        >
        <include layout="@layout/content" />
    </Android.support.v7.widget.CardView>
</merge>
0
owjsub

Je sais qu'il est tard mais j'espère que cela aidera quelqu'un

app:cardPreventCornerOverlap="false"

définir l'application: cardPreventCornerOverlap sur false fera l'affaire :)

0
Zubair Rehman