RecyclerView中的CardView具有额外的利润

时间:2014-11-18 13:13:26

标签: android eclipse-adt android-recyclerview android-cardview

我在RecyclerView中使用CardView作为元素。这样做时,android会自动在cardView和屏幕之间以及不同的cardView之间生成边距。

<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" />

我按照链接中的说明将它们集成到我的项目中: using-recyclerview-and-cardview-in-eclipse-adt

我之前使用过linelayout作为列表元素:

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

这完全正常,列表元素之间没有任何边距。我现在只是将线性布局放在cardView中,这导致了额外的边距。

原因是我想为这些元素提供精确的边距,而我现在提供的任何边距都会被添加到这个预先存在的边距。 我已经尝试向cardView元素提供零/负填充/边距,但这些都不起作用。

任何想法,我都可以删除这些边距或者确切地知道添加了多少边距。

10 个答案:

答案 0 :(得分:44)

它对我有用。使用:

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

答案 1 :(得分:41)

你检查它是否是边距或填充? (开发选项/显示布局边界)

CardView在L前面的平台中添加填充以绘制阴影。在L中,除非您设置useCompatPadding=true,否则不应有任何差距。

添加负边距(尽管很难看)应该有用。如果不是,请添加一些代码,说明如何添加它们以及如何设置RecyclerView

答案 2 :(得分:17)

在@yigit的回答中,CardView将添加默认填充以在Android L之前绘制它的阴影。填充大小在CardView的doc中描述。

我发现清除此填充(也为内容添加填充)的方法是使用CardView的contentPaddingLeft(/ Right / Top / Bottom)属性。

如果要清除默认填充,可以将contentPadding设置为负值。如果要添加内容填充,请将contentPadding设置为所需的值。

就我而言,我使用这些代码来清除默认填充:

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

我尝试了@Shubham的回答,但在RadialGradient.java中抛出了IllegalStateException,并显示“radius必须为&gt; 0”的消息。

答案 3 :(得分:14)

使用以下两个标签:

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

答案 4 :(得分:4)

card_view:cardPreventCornerOverlap="false"添加到card 仅当您的图像具有圆角时才有效

答案 5 :(得分:2)

好吧,似乎有一种更简单的方法可以做到这一点,而无需猜测填充和所有:

card_view:cardPreventCornerOverlap="false"

或使用java:

cardView.setPreventCornerOverlap(false)

答案 6 :(得分:1)

来自@ vj9的评论在已接受的问题下帮助我计算了抵消额。在这里分享,因为它可能会帮助其他人:

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

答案 7 :(得分:0)

使用

android:adjustViewBounds="true"

在想要包含在cardview中的视图

答案 8 :(得分:0)

我知道它已经很晚了,但我希望它会帮助某人

app:cardPreventCornerOverlap="false"

将app:cardPreventCornerOverlap设置为false可以解决问题:)

答案 9 :(得分:-2)

myCardView.setShadowPadding(0,0,0,0);