2014-11-18 12 views
29

Я использую 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, но ни одна из этих функций не работает.

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

ответ

40

Вы проверили, является ли это маркой или отступом? (Параметры Dev/показать границы разметки)

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

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

+4

Это набивка да я тестирую на предварительно L устройства. Спасибо, что указали мне в правильном направлении: в документации CardView я нашел следующее: Перед L CardView добавляет дополнение к своему контенту и рисует тени в этой области. Это количество дополнений равно maxCardElevation + (1 - cos45) * cornerRadius по бокам и maxCardElevation * 1.5 + (1 - cos45) * cornerRadius сверху и снизу. Я могу определить значения заполнения из этого (и вычесть из того, что я хочу предоставить). На данный момент у меня нет устройства L, обновляется, как только я проверю это. ps: -ve поля не работают. – vj9

+3

Точнее: card_view: cardUseCompatPadding = "true" –

+0

Это сработало для меня: https://android.jlelse.eu/using-full-width-cards-to-maximize-content-f739cb863ce8 –

42

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

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

Это, помимо настройки 'cardCornerRadius =" 1dp "' или какая-то другая произвольная сумма сработала для меня! Спасибо, @Shubham Я думаю, что установка картыMaxElevation сделала трюк – w3bshark

+8

Ну, я не хочу снимать высоту карты, поэтому ваше решение не идет – Toochka

+0

Простое решение. –

4

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

17

Просто описано в ответ @yigit «s, то CardView добавит отступов по умолчанию для рисования это тень, прежде чем Android L. Размер заполнения описан в документе CardView.

Я нашел способ очистить это дополнение (также добавить дополнение для контента), чтобы использовать атрибуты contentPaddingLeft (/ Right/Top/Bottom) CardView.

Если вы хотите очистить отступ по умолчанию, вы можете установить для contentPadding значение минус. Если вы хотите добавить добавление контента, установите для contentPadding значение, которое вы хотите.

В моем случае, я использую эти символы, чтобы очистить отступы по умолчанию:

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

Я попытался ответить @Shubham «s, но IllegalStateException брошен в RadialGradient.java с сообщением«радиус должен быть> 0" .

+0

Это не идеально, но работает обходной путь;) Спасибо! – Tomas

13

Используйте эти две метки ниже:

card_view:cardPreventCornerOverlap="false" 
card_view:cardUseCompatPadding="true" 
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); 
} 
+0

Не было бы лучше получить реальную высоту с карты, вместо того, чтобы предполагать, что она использует высоту по умолчанию? Sth как 'float elevation = cardView.getCardElevation();' – Alf

+0

То же самое для радиуса: 'float radius = cardView.getRadius();' – Alf

+0

Если вы не используете стиль карточного стиля по умолчанию, конечно. Или изменить его на свои собственные размеры. –

2

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

card_view:cardPreventCornerOverlap="false" 

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

cardView.setPreventCornerOverlap(false) 
-2

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

+0

Этот метод скрыт! –

0

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

android:adjustViewBounds="true" 

на взгляд вы хотите, завернутые в cardview

0

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

app:cardPreventCornerOverlap="false" 

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

0

Если вам не нужен угловой радиус или верхний уровень, co nsider используя FrameLayout на pre-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> 

 Смежные вопросы

  • Нет связанных вопросов^_^