web-dev-qa-db-ja.com

CardView layout_width = "match_parent"は親のRecyclerViewの幅と一致しません

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のアイテムは、layout_width = "match_parent"を持つCardViewです:

<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としてレンダリングされます。

CardsBug

これは実際のデバイスではなく、エミュレーターで実行されたことに注意してください。

私は何か間違ったことをしていますか、それともバグですか?

116
ProgrAmmar

inflateのドキュメント:

指定したxmlリソースから新しいビュー階層を膨張させます。エラーがある場合、InflateExceptionをスローします。

パラメーター
resourceロードするXMLレイアウトリソースのID(R.layout.main_pageなど)ルート
viewは、生成された階層の親になります(attachToRootがtrueの場合)、または単純に、返されたルートのLayoutParams値のセットを提供するオブジェクト階層(attachToRootがfalseの場合)
attachToRoot膨張した階層をルートパラメータにアタッチする必要があるかどうか。 falseの場合、ルートは、XMLのルートビューのLayoutParamsの正しいサブクラスを作成するためにのみ使用されます。戻り値膨張した階層のルートビュー。ルートが指定され、attachToRootがtrueの場合、これはルートです。それ以外の場合は、膨張したXMLファイルのルートです。

ここで重要なのは、nottrueを指定することですが、do親を指定することです:

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

parentビューを指定すると、インフレータは使用するレイアウトパラメータを知ることができます。 falseパラメータを指定すると、notまだ親にアタッチするように指示されます。それがRecyclerViewがあなたのためにすることです。

279
nhaarman

RelativeLayoutをCardViewの直接の親として使用します。

<RelativeLayout 
    Android:layout_width="match_parent" ... >
    <CardView 
        Android:layout_width="match_parent" ... >
    </CardView>
</RelativeLayout>
57
Ganesh Kanna

これは私のために働いた、

 View viewHolder= LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, null, false);
 viewHolder.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
 return new ViewOffersHolder(viewHolder);
11
anurag_dake

私がやった方法は:

View view = mInflater.inflate(R.layout.row_cardview, null, true);
            WindowManager windowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
            int width = windowManager.getDefaultDisplay().getWidth();
            view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT));

説明:カードビューを取得したら、onCreateViewHoldeで画面幅を取得し、カードビューのレイアウトパラメータを適宜設定します。

6
Rahul

これは'com.Android.support:recyclerview-v7:23.2.1'で修正されているようです

詳細については、 RecyclerView wrap_content を参照してください。

5
speedynomads

新しいレイアウトパラメータを設定するだけです

view.setLayoutParams(new RecyclerView.LayoutParams(
    RecyclerView.LayoutParams.MATCH_PARENT,
    RecyclerView.LayoutParams.WRAP_CONTENT
));
4
V. Kalyuzhnyu

デフォルトの実装では、デフォルトのレイアウトマネージャーでwrap_contentを強制的に使用します。

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}

あなたがしなければならないのは、このようにLayoutManagerでこのメソッドをオーバーライドすることです:

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}
3
issamux

これは私のために働く

View view = inflator.inflate(R.layout.layout_item, ***null***, false);
2
DiRiNoiD

負の値でcard_view:contentPaddingを使用します

<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:layout_width="match_parent"
    card_view:contentPadding="-4dp"
    card_view:cardElevation="0dp"
    Android:layout_height="wrap_content">

それは私のために働いた

1