webentwicklung-frage-antwort-db.com.de

CardView in RecyclerView hat zusätzliche Ränder

Ich verwende eine CardView als Element in einer RecyclerView. Dabei erzeugt Android automatisch Ränder zwischen der Kartenansicht und dem Bildschirm sowie zwischen verschiedenen Kartenansichten.

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

Ich habe die Anweisungen im Link befolgt, um sie in mein Projekt zu integrieren: sing-recyclerview-and-cardview-in-Eclipse-adt

Ich hatte zuvor ein lineares Layout für das Listenelement verwendet:

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

Dies funktionierte einwandfrei, ohne irgendwelche Abstände zwischen den Listenelementen. Ich habe jetzt gerade das lineare Layout in der Kartenansicht platziert, was zu zusätzlichen Rändern geführt hat.

Der Grund dafür ist, dass ich diesen Elementen exakte Ränder zuweisen möchte, und alle Ränder, die ich jetzt bereitstelle, werden zu diesen bereits vorhandenen Rändern hinzugerechnet. Ich habe versucht, dem cardView-Element null/negative Abstände/Ränder zuzuweisen, aber nichts davon funktioniert.

Wie auch immer, ich kann diese Ränder entfernen oder auf andere Weise genau wissen, wie viel Rand hinzugefügt wird.

32
vj9

haben Sie überprüft, ob es sich um einen Rand oder eine Polsterung handelt? (Entwickleroptionen/Layoutgrenzen anzeigen)

CardView fügt Füllungen in Plattformen vor L hinzu, um Schatten zu zeichnen. In L, außer Sie setzen useCompatPadding=true, es sollte keine Lücke geben.

Das Hinzufügen negativer Ränder (obwohl es hässlich ist) sollte funktionieren. Ist dies nicht der Fall, fügen Sie bitte weiteren Code hinzu, wie Sie diese hinzufügen und wie Sie RecyclerView einrichten.

41
yigit

Es hat bei mir funktioniert. Verwenden:

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

Soeben in der Antwort von @yigit beschrieben, fügt CardView einen Standardabstand ein, um den Schatten vor Android L zu zeichnen. Die Abstandsgröße wird im CardView-Dokument beschrieben.

Ich habe herausgefunden, dass der Weg, um dieses Auffüllen zu löschen (auch um Auffüllen für Inhalte hinzuzufügen), darin besteht, die contentPaddingLeft (/ Right/Top/Bottom) -Attribute von CardView zu verwenden.

Wenn Sie den Standardabstand löschen möchten, können Sie den contentPadding-Wert auf minus setzen. Wenn Sie eine Inhaltsauffüllung hinzufügen möchten, setzen Sie die Inhaltsauffüllung auf den gewünschten Wert.

In meinem Fall verwende ich diesen Code, um die Standardauffüllung zu löschen:

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

Ich habe @Shubhams Antwort versucht, aber in RadialGradient.Java wird eine IllegalStateException mit der Meldung "radius must be> 0" ausgelöst.

18
Piasy

Verwenden Sie diese beiden Tags unten:

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

hinzufügen card_view:cardPreventCornerOverlap="false" zu Ihrem card Es funktioniert nur, wenn Ihr Bild abgerundete Ecken hat

4
Shayan_Aryan

Nun, es scheint, dass es einen viel einfacheren Weg gibt, ohne die Polsterung und alles zu erraten:

card_view:cardPreventCornerOverlap="false"

oder mit Java:

cardView.setPreventCornerOverlap(false)
2
Ani kukadiya

Der Kommentar von @ vj9 unter der akzeptierten Frage half mir bei der Berechnung der Offsets. Teilen Sie es hier, weil es jemand anderem helfen könnte:

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);
} 
1
Markus Rubey

verwenden

Android:adjustViewBounds="true"

in der Ansicht, die Sie in die Kartenansicht einwickeln möchten

0

Wenn Sie den Eckenradius oder die Höhenunterschiede nicht benötigen, können Sie FrameLayout für Pre-Lollipop verwenden.

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

layout/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>
0
owjsub

Ich weiß, es ist spät, aber ich hoffe, es wird jemandem helfen

app:cardPreventCornerOverlap="false"

setze app: cardPreventCornerOverlap auf false, um den Trick zu machen :)

0
Zubair Rehman