Android CardView внутри RecyclerView - cardElevation вызывает нежелательные поля и нижнюю тень

В Android я использую RecyclerView. Для элемента RecyclerView я использую CardView в качестве макета элемента с макетом XML ниже:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="0dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="0dp"
    app:cardElevation="2dp"
    app:cardCornerRadius="0dp"
    app:cardPreventCornerOverlap="false"

    android:foreground="?attr/selectableItemBackground"
    android:clickable="true" >

    <LinearLayout
        android:minHeight="48dp"
        android:layout_marginTop="0dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="0dp"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    .......

    </LinearLayout>
</CardView>

Я использую CardView от android.support.v7.widget.CardView.

Я поставил cardElevation="2dp", layout_marginBottom="0dp", layout_marginTop="0dp". Настройка cardElevation создает тень вокруг левой, правой и нижней части CardView. Затем, установив layout_marginBottom & layout_marginTop=0dp, если элемент не является последним элементом в списке, его нижняя тень будет disappear, так как она будет закрыта следующим элементом (CardView) в списке.

Ниже приведено предполагаемое поведение пользовательского интерфейса. Весь список наблюдения выглядит как одиночный CardView, но на самом деле это RecyclerView, где каждый элемент состоит из CardView, только нижняя тень перекрывается следующим элементом под ним. Это хорошо работает в Android API 25 (Android 7.1.2):

Правильное поведение — API 25

Но в Android API 16 (Android 4.1.2) результат не такой, как ожидалось. Нижняя тень (граница) по-прежнему видна, также похоже, что между каждым элементом добавлено дополнительное поле.

Неправильное поведение — API 16

Любая идея, как решить эту проблему в Android 4.1.2?


person Shuwn Yuan Tee    schedule 25.07.2017    source источник
comment
Атрибут Elevation применим только в Android API старше 21 года. ‹br›Проверьте эту ссылку, чтобы получить представление о реализации желаемого эффекта. ниже API 21:   -  person Kavach Chandra    schedule 25.07.2017
comment
ОП не спрашивает, почему Elevation не работает. (Она использует app:cardElevation из библиотеки поддержки. Таким образом, имеет смысл увидеть эффект высоты в Android 4) Она спрашивает, почему между строками нет пробела в Android 6, но есть пробел между строками в Android 4.   -  person Cheok Yan Cheng    schedule 25.07.2017


Ответы (1)


Я предполагаю, что вы используете CardView из библиотеки поддержки. В разных версиях Android существуют разные реализации просмотра карт.

Я считаю, что до Android L библиотека добавляла отступы, чтобы зарезервировать место для рисования теней.

Пожалуйста, проверьте CardView внутри RecyclerView имеет дополнительные поля для получения дополнительной информации.

person Cheok Yan Cheng    schedule 25.07.2017