130

我有一个片段,其中包含一个带有 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,如下所示:

CardsBug

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

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

4

10 回答 10

300

的文档inflate

从指定的 xml 资源扩充新的视图层次结构。如果有错误,则抛出 InflateException。

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

这里重要的是不要提供 true,但提供父级:

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

提供parent视图让充气器知道要使用哪些布局参数。提供false参数告诉它暂时不要将其附加到父级。这就是RecyclerView意志为你做的。

于 2014-07-01T06:55:41.497 回答
76

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

<RelativeLayout 
    android:layout_width="match_parent" ... >
    <CardView 
        android:layout_width="match_parent" ... >
    </CardView>
</RelativeLayout>
于 2016-01-10T10:36:44.450 回答
12

这对我有用,

 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);
于 2016-09-24T16:53:20.037 回答
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 中,一旦您获得卡片视图,获取屏幕宽度,然后为卡片视图相应地设置布局参数。

于 2015-12-31T10:37:30.390 回答
5

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

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

于 2016-03-21T11:51:21.783 回答
4

默认实现强制在默认布局管理器中使用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);
}
于 2016-11-04T20:51:08.323 回答
4

只需设置新的布局参数

view.setLayoutParams(new RecyclerView.LayoutParams(
    RecyclerView.LayoutParams.MATCH_PARENT,
    RecyclerView.LayoutParams.WRAP_CONTENT
));
于 2016-11-09T13:16:19.147 回答
2

这对我有用

View view = inflator.inflate(R.layout.layout_item, ***null***, false);
于 2016-07-21T20:43:30.953 回答
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">

它对我有用

于 2016-09-14T16:16:25.993 回答
-1

包裹CardView在具有宽度的布局中:match_parent

于 2016-07-26T07:24:25.037 回答