Android CardView布局“U宽度=”;匹配“家长”;与父RecyclerView宽度不匹配

Android CardView布局“U宽度=”;匹配“家长”;与父RecyclerView宽度不匹配,android,android-layout,android-5.0-lollipop,android-recyclerview,android-cardview,Android,Android Layout,Android 5.0 Lollipop,Android Recyclerview,Android Cardview,我有一个包含布局为\u width=“match\u parent”的RecyclerView的片段: 但当我运行应用程序时,CardView呈现为wrap_内容,如下所示: 请注意,这是在emulator上运行的,不是真正的设备 我是做错了什么,还是它是一个bug?用于充气的文档: 从指定的xml资源展开新的视图层次结构。投掷 如果出现错误,则为充气异常 参数 资源要加载的XML布局资源的ID(例如。, R.layout.main_页)根目录 查看以作为 生成的层次结构(如果attachTo

我有一个包含布局为\u width=“match\u parent”的RecyclerView的片段:

但当我运行应用程序时,CardView呈现为wrap_内容,如下所示:

请注意,这是在emulator上运行的,不是真正的设备


我是做错了什么,还是它是一个bug?

用于
充气的文档:

从指定的xml资源展开新的视图层次结构。投掷 如果出现错误,则为充气异常

参数
资源要加载的XML布局资源的ID(例如。, R.layout.main_页)根目录
查看以作为 生成的层次结构(如果attachToRoot为true),或者 对象,该对象为的根提供一组LayoutParams值 返回的层次结构(如果attachToRoot为false)。
附件是否 膨胀的层次结构应附加到根参数?如果 false,root仅用于创建的正确子类 XML中根视图的LayoutParams。返回的根视图 膨胀的等级制度。如果提供了root并且attachToRoot为true, 这是根;否则它就是膨胀的XML文件的根

此处重要的是不要提供true,但要提供父级:

LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);
提供
父视图
可让充气机知道要使用的布局参数。提供
false
参数告诉它暂时不要将其附加到父级。这就是回收视图将为您所做的。

我这样做的方式是:

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));
说明:
在OnCreateViewHold中,获得card view后,获取屏幕宽度,然后相应地设置card view的布局参数。

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

cardwiew
包装在具有宽度的布局中:
match\u parent
使用card\u视图:内容填充为负值

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

默认实现强制在默认布局管理器中使用包装内容

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

在对CardView进行充气时,是否为父视图提供了一个真实参数?您好@NiekHaarman,请参见编辑。我加上了充气密码。是的,我已经传递了true参数。解决方案对我不起作用,因为ListView的
layout\u width
wrap\u content
。这很奇怪,因为这不应该影响列表视图!因此,我的理解是,当您向LayoutFlater提供false作为参数时,ListView会使用与ListView自身匹配的布局参数将列表项添加到ListView中!:0是否可以再发布一点代码,因为我认为我也这么做了,但实际上它不起作用。我正在夸大您的建议和匹配方式\u parent对我不起作用。我认为正确的理解是,当您将attachToRoot设置为false时,您需要提供一个具有已定义LayoutParams值的对象。该对象不一定是父对象。“…仅仅是一个为返回的层次结构的根提供一组LayoutParams值的对象(如果attachToRoot为false.)…”但我不明白为什么inflater无法读取在CardView中定义的LayoutParams,但需要另一个对象参数来通知它?如果我使用自定义视图,如何处理它?我的意思是
ViewHolder onCreateViewHolder(…){View v=newmyitemview(parent.getContext);返回newviewholder(v);}
请稍微改进一下。它基本上是说“试试这个”添加了解释。请检查,如果需要任何进一步的帮助,请在这里发表评论。是的,这似乎也适用于我。我使用的是LinearLayout,上面的建议不起作用,因为我已经这样做了(即不附加到root,而是提供一个父级)。您必须同时执行RelativeLayout+和RelativeLayout+这两项操作,而不是附加父项,而是提供一项。这对我很有效,但我不知道为什么这样做可以解决问题。有人能解释为什么吗?已经很久了,安卓x已经在生产了,但这个bug还没有修复!最简单的方法。我有一个类似的问题,这对我的工作,以纠正我的卡视图的宽度,但我有一个类似的问题,高度?你能给我一些建议吗?我发现在onBindViewHolder()中这样做在使用从ConstraintLayout继承的自定义视图类时很有用。这不是一个好的答案,因为设置到布局的边距将受到影响。
  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}
  @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
));