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中的项目也是一个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,如下所示:

CardsBug

请注意,这是在仿真器上运行,而不是一个真正的设备。

我做错了什么,或者是一个错误?

inflate的文件:

从指定的xml资源膨胀一个新的视图层次结构。 如果出现错误,则抛出InflateException。

参数
要加载的XML布局资源的资源 ID(例如,R.layout.main_page)
视图是生成的层次结构的父级(如果attachToRoot为true),或者只是为返回的层次结构的根提供一组LayoutParams值的对象(如果attachToRoot为false)。
attachToRoot是否将膨胀层次结构附加到根参数? 如果为false,则root仅用于为XML中的根视图创buildLayoutParams的正确子类。 返回充气层次结构的根视图。 如果提供了root并且attachToRoot为true,则这是root; 否则它是膨胀的XML文件的根。

在这里重要的是提供真实的,但提供给家长:

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

提供parent视图,让inflater知道使用什么样的layoutparams。 提供false参数告诉它不要把它附加到父对象上。 这就是RecyclerView会为你做的。

使用RelativeLayout作为CardView的直接父对象。

 <RelativeLayout android:layout_width="match_parent" ... > <CardView android:layout_width="match_parent" ... > </CardView> </RelativeLayout> 

我做的方式是:

 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中获取屏幕宽度,然后相应地设置卡片视图的布局参数。

这对我有用,

  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); 

这似乎是固定在'com.android.support:recyclerview-v7:23.2.1'

请参阅: RecyclerView wrap_content进一步讨论。

只需设置新的布局参数

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

这对我有用

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

默认实现强制在默认布局pipe理器中使用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); } 

以负值使用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"> 

它为我工作

CardView在宽度为match_parent的布局中