CardViewは通常、1つの要素を装飾するために使用されます。ただし、このウィジェットにいくつかの項目をラップする必要がある場合があります。たとえば、受信トレイアプリのように。
では、これを行うための最良の方法は何ですか?カスタムLayoutManagerまたはカスタムItemDecorationを介して実装できます。カスタムLayoutManagerの実装は簡単な作業ではありません(アニメーション、アイテムの装飾などを完全にサポートしています)。 2番目のオプションでは、CardView(およびAndroid-L標高)の実装を無視して、境界の描画を手動で実装する必要があります。
要素をホストするのはoneCardView
ではなく、いくつかの連続するCardView
sであり、異なるマージン:
グループの上位のCardView
の場合:
Android:layout_marginTop="5dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="0dp"
card_view:cardCornerRadius="0dp"
グループの一番下のCardView
の場合:
Android:layout_marginTop="0dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="5dp"
card_view:cardCornerRadius="0dp"
そして真ん中のものは、マージンTop&Bottomを0に設定します。
Android:layout_marginTop="0dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="0dp"
card_view:cardCornerRadius="0dp"
これはアプリの階層です(もちろん、少し簡略化されています):
| Android.support.v4.widget.DrawerLayout
FrameLayout
------- | Android.support.v7.widget.RecyclerView
------- | Android.support.v7.widget.Toolbar
--- | Android.support.design.widget.NavigationView
ナビゲーションドロワーと折りたたまれたカードがなくても、完全な構造は次のようになります。---(
興味深い部分は、RecyclerView
のアイテム構造に飛び込むときに始まります。
Googleが使用するアイテムには2種類あります。セパレーター(右側に日付とアクションがあります)とカードです。カードの内容は異なりますが、ViewHolder
の観点から-RecyclerView
には2種類のアイテムがあります)
これは単なるLinearLayout
で、内部にTextView
とImageView
があります。
そのレイアウトは、コンテンツがViewHolder
にバインドされていることに基づいて調整されます。たとえば、フォーカスされているような単純な電子メールは、ネストされたCardView
と3つのImageView
sを持つTextView
です。
したがって、残っている唯一の質問は、Googleの連中がカードを1つの大きなカードに「マージ」して、余分な影を避ける方法です。
トリックは本当に簡単です:
CardView
にはcard_view:cardCornerRadius="0dp"
がありますグループの上部のCardView
には、上部/左側/右側に5dpのマージンが設定されていますが、下部には0dpが設定されています。
Android:layout_marginTop="5dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="0dp"
グループの下部CardView
には、左/右/下に5dpのマージンが設定されていますが、上部には0dpが設定されています。
Android:layout_marginTop="0dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="5dp"
グループの中央のCardView
には、左/右に5dpのマージンが設定されていますが、上/下に0dpが設定されています。
Android:layout_marginTop="0dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="0dp"
それでおしまい!
これが私が書いた小さな例です:
レイアウト(トリッキーなマージンあり)
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:padding="16dp"
xmlns:card_view="http://schemas.Android.com/apk/res-auto">
<Android.support.v7.widget.CardView
Android:layout_gravity="center"
Android:layout_width="match_parent"
Android:layout_height="100dp"
Android:layout_marginTop="5dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="0dp"
card_view:cardCornerRadius="0dp"
card_view:contentPadding="10dp">
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:text="card1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textStyle="bold"/>
</FrameLayout>
</Android.support.v7.widget.CardView>
<Android.support.v7.widget.CardView
Android:layout_gravity="center"
Android:layout_width="match_parent"
Android:layout_height="100dp"
Android:layout_marginTop="0dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="0dp"
card_view:cardCornerRadius="0dp"
card_view:contentPadding="10dp">
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:text="card2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textStyle="bold"/>
</FrameLayout>
</Android.support.v7.widget.CardView>
<Android.support.v7.widget.CardView
Android:layout_gravity="center"
Android:layout_width="match_parent"
Android:layout_height="100dp"
Android:layout_marginTop="0dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:layout_marginBottom="5dp"
card_view:cardCornerRadius="0dp"
card_view:contentPadding="10dp">
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:text="card3"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textStyle="bold"/>
</FrameLayout>
</Android.support.v7.widget.CardView>
</LinearLayout>
私はそれが役立つことを願っています