Подтвердить что ты не робот

CardView внутри RecyclerView имеет дополнительные поля

Я использую элемент CardView как элемент внутри RecyclerView. При этом андроид автоматически создает поля между картой и экраном и между различными картами.

<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

Ранее я использовал элемент linearlayout для элемента списка:

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

Это работало отлично, без каких-либо полей между элементами списка. Теперь я просто разместил линейный макет внутри cardView, который привел к дополнительным полям.

Причина в том, что я хочу предоставить точные поля этим элементам, и все поля, которые я поставлю сейчас, добавляются к этим ранее существующим полям. Я попытался подавать нулевые/отрицательные прокладки/поля в элемент cardView, но ни одна из них не работает.

Любая идея, я могу удалить эти поля или иначе точно знать, сколько полей добавляется.

4b9b3361

Ответ 1

Вы проверяли, является ли это маркой или дополнением? (Параметры Dev/show layout bounds)

CardView добавляет дополнение на платформах pre-L для рисования теней. В L, если вы не установили useCompatPadding=true, не должно быть никакого пробела.

Добавление отрицательных полей (хотя и уродливое) должно работать. Если это не так, добавьте еще какой-нибудь код о том, как вы их добавляете, и о том, как вы настраиваете RecyclerView.

Ответ 2

Это сработало для меня. Использование:

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

Ответ 3

Только что описанный в ответе @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, но исключение IllegalStateException в RadialGradient.java с сообщением "радиус должен быть > 0".

Ответ 4

Используйте следующие два тега:

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

Ответ 5

добавьте card_view:cardPreventCornerOverlap="false" в свой card Он работает только в том случае, если у вашего изображения закругленные углы

Ответ 6

Ну, кажется, есть гораздо более простой способ сделать это, не догадываясь о дополнении и всем:

card_view:cardPreventCornerOverlap="false"

или с помощью java:

cardView.setPreventCornerOverlap(false)

Ответ 7

Комментарий от @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);
} 

Ответ 8

использование

android:adjustViewBounds="true"

в представлении, которое вы хотите обернуть в кард-карте

Ответ 9

Я знаю его поздно, но я надеюсь, что это поможет кому-то

app:cardPreventCornerOverlap="false"

приложение настройки: cardPreventCornerOverlap для false сделает трюк:)

Ответ 10

Если вам не нужен угловой радиус или верхний уровень, рассмотрите возможность использования FrameLayout в пред-Lollipop.

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

Макет-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>

Ответ 11

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