1. ホーム
  2. android

[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。

2022-07-02 04:51:50

質問

私は、layout_width="match_parent"を持つRecyclerViewを含むフラグメントを持っています。

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$PlaceholderFragment" />

RecyclerViewのアイテムもCardViewでlayout_width="match_parent"とします。

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="20dp"
    card_view:cardCornerRadius="4dp">

    <TextView
        android:layout_gravity="center"
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent"
        android:textAppearance="?android:textAppearanceLarge"/>
</android.support.v7.widget.CardView>

アイテムビューを以下のように膨らませています。

public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        CardView v = (CardView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_listitem, null, true);

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

しかし、アプリを実行すると、以下のようにCardViewはwrap_contentとしてレンダリングされます。

これは実機ではなく、エミュレータ上で実行されたことに注意してください。

何か間違ったことをしているのでしょうか、それともバグなのでしょうか?

どうすればよいのでしょうか?

のドキュメントは inflate :

指定されたxmlリソースから新しいビュー階層を展開します。スロー エラーが発生した場合は InflateException をスローします。

パラメータ

リソース ロードするXMLレイアウトリソースのためのID (例, R.layout.main_page) ルート

ビュー の親になります。 生成された階層の親であるか(attachToRootがtrueの場合)、さもなければ単に オブジェクトが返されます。 の値を提供するオブジェクトです(attachToRoot が false の場合)。

attachToRoot というのは は、膨張した階層をルートパラメータにアタッチするかどうか?もし falseの場合、rootは正しいサブクラスの LayoutParamsの正しいサブクラスを作成するためにのみ使用されます。Returns 膨張した階層のルートビューを返します。 を返します。rootが指定され、attachToRootがtrueの場合、これはrootとなります。 それ以外の場合は、XMLファイルのルートとなります。

ここで重要なのは ではなく を真にするのではなく する は親を供給する。

LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

を供給することで parent ビューを提供することで、インフレータはどのレイアウトパラメータを使うべきかを知ることができます。また false パラメータを与えることで、インフレータに ではなく を指定します。これが RecyclerView がやってくれることです。