CardView lay_ width = “ match_father”与父回收视图宽度不匹配

我有一个片段,其中包含了一个易于回收的视图,其布局宽度 = “ match _ father”:

<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" />

该回收视图中的项目是一个 CardView,其中还包含 laywidth = “ match _ father”:

<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 会显示为 wrash _ content,如下所示:

CardsBug

注意,这是在模拟器上运行的,不是真正的设备。

是我做错了什么,还是只虫子?

66335 次浏览

inflate的文件:

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

参数
要加载的 XML 布局资源的 ID (例如, Main _ page)根目录
视图 作为 生成的层次结构(如果 attachToRoot 为 true) ,或者只是一个 对象的根提供一组 LayoutParams 值 返回的层次结构(如果 attachToRoot 为 false)
是否 膨胀的层次结构应该附加到根参数? 如果 False,root 只用于创建正确的子类 根视图的 LayoutParams。返回 如果提供了 root 并且 attachToRoot 为 true, 这是 root; 否则它就是膨胀 XML 文件的根。

在这里,没有提供真实情况很重要,但 提供母公司:

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

提供 parent视图让充气机知道使用什么布局参数。提供 false参数告诉它 没有将其附加到父级。这就是 RecyclerView将为你做的。

我的方法是:

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

使用 RelativeLayout 作为 CardView 的直接父级。

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

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

参见: 回收视图包装内容进一步讨论。

这对我有用

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

在宽度为 match_parent的布局中包装 CardView

使用具有负值的 card _ view: contentPding

<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">

这招对我很管用

这招对我很管用,

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

默认实现强制在默认布局管理器中使用 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.setLayoutParams(new RecyclerView.LayoutParams(
RecyclerView.LayoutParams.MATCH_PARENT,
RecyclerView.LayoutParams.WRAP_CONTENT
));