CardView layout_width =“match_parent”与父级RecyclerView宽度不匹配

时间:2014-07-01 06:31:36

标签: android android-layout android-5.0-lollipop android-recyclerview android-cardview

我有一个包含RecyclerView的片段,其中layout_width =" match_parent":

<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 =&#34; match_parent&#34;:

<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

请注意,这是在模拟器上运行,而不是在真实设备上运行。

我做错了什么,还是个错误?

10 个答案:

答案 0 :(得分:275)

inflate的文档:

  

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

     

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

这里重要的是供应为真,但供应父母:

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

提供parent视图可让inflater了解要使用的layoutparams。提供false参数告诉它将它附加到父级。这就是RecyclerView将为您做的事情。

答案 1 :(得分:54)

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

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

答案 2 :(得分:11)

这对我有用,

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

答案 3 :(得分:6)

我这样做的方式是:

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

答案 4 :(得分:5)

这似乎已在'com.android.support:recyclerview-v7:23.2.1'

中修复

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

答案 5 :(得分:4)

只需设置新的布局参数

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

这对我有用

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

答案 8 :(得分:1)

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

它对我有用

答案 9 :(得分:-1)

在宽度为CardView

的布局中换行match_parent