繁体   English   中英

RecyclerView中的CardView具有额外的边距

[英]CardView inside RecyclerView has extra margins

我使用CardView作为RecyclerView中的元素。 这样做时,android自动在cardView和屏幕之间以及不同的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" />

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

我以前一直在为list元素使用linearlayout:

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

这工作得很好,列表元素之间没有任何空白。 现在,我刚刚将线性布局放置在cardView内,这导致了额外的边距。

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

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

它为我工作。 使用:

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

您是否检查了边距或填充? (开发选项/显示布局范围)

CardView在平台pre-L中添加填充以绘制阴影。 在L中,除非您设置useCompatPadding=true ,否则不应存在任何间隙。

添加负边距(尽管很丑)应该可以。 如果不是,请添加更多有关如何添加它们以及如何设置RecyclerView

就像@yigit的答案中所述,CardView将在Android L之前添加默认的填充以绘制阴影。CardView的文档中描述了填充大小。

我发现清除此填充(也为内容添加填充)的方法是使用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,消息为“半径必须> 0”。

在下面使用这两个标签:

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

card_view:cardPreventCornerOverlap="false"card仅当图像具有圆角时才有效

好吧,似乎有一种更简单的方法可以执行此操作,而无需猜测填充和所有内容:

card_view:cardPreventCornerOverlap="false"

或使用Java:

cardView.setPreventCornerOverlap(false)

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

使用

android:adjustViewBounds="true"

在您要包装在cardview中的视图上

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

app:cardPreventCornerOverlap="false"

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

如果您不需要拐角半径或下标高,请考虑在棒棒糖之前使用FrameLayout

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

布局/ 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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM