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としてレンダリングされます。
これは実際のデバイスではなく、エミュレーターで実行されたことに注意してください。
私は何か間違ったことをしていますか、それともバグですか?
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
があなたのためにすることです。
RelativeLayoutをCardViewの直接の親として使用します。
<RelativeLayout
Android:layout_width="match_parent" ... >
<CardView
Android:layout_width="match_parent" ... >
</CardView>
</RelativeLayout>
これは私のために働いた、
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);
私がやった方法は:
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で画面幅を取得し、カードビューのレイアウトパラメータを適宜設定します。
これは'com.Android.support:recyclerview-v7:23.2.1'
で修正されているようです
詳細については、 RecyclerView wrap_content を参照してください。
新しいレイアウトパラメータを設定するだけです
view.setLayoutParams(new RecyclerView.LayoutParams(
RecyclerView.LayoutParams.MATCH_PARENT,
RecyclerView.LayoutParams.WRAP_CONTENT
));
デフォルトの実装では、デフォルトのレイアウトマネージャーで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);
}
これは私のために働く
View view = inflator.inflate(R.layout.layout_item, ***null***, false);
負の値で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">
それは私のために働いた