当前位置: 首页 > 知识库问答 >
问题:

CardView layout\u width=“match\u parent”与parent RecyclerView width不匹配

程瑞
2023-03-14

我有一个片段,其中包含一个具有layout\u width=“match\u 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" />

回收站视图中的项目是一个卡片视图,也有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如下所示:

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

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

共有3个答案

卢志行
2023-03-14

这对我来说很管用,

 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);
益绯辞
2023-03-14

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

<RelativeLayout 
    android:layout_width="match_parent" ... >
    <CardView 
        android:layout_width="match_parent" ... >
    </CardView>
</RelativeLayout>
申屠亦
2023-03-14

充气文档:

从指定的xml资源扩展新的视图层次结构。如果出现错误,则引发InflateException。

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

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

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

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

 类似资料:
  • 间接地访问一个变量不可能在分支中使用这个没有重新绑定的变量。 match 提供了 @ 符号来绑定变量到名称: // `age` 函数,返回一个 `u32` 值。 fn age() -> u32 { 15 } fn main() { println!("Tell me type of person you are"); match age() { 0

  • 可以加上 match 守卫(guard) 来过滤分支。 fn main() { let pair = (2, -2); // 试一试 ^ 将不同的值赋给 `pair` println!("Tell me about {:?}", pair); match pair { (x, y) if x == y => println!("These are t

  • match 代码块可以以多种方式解构内容。

  • Rust 通过 match 关键字来提供模式匹配,用法和 C 语言的的 switch 类似。 fn main() { let number = 13; // 试一试 ^ 将不同的值赋给 `number` println!("Tell me about {}", number); match number { // 匹配单个值 1 =>

  • 模式匹配,多出现在函数式编程语言之中,为其复杂的类型系统提供一个简单轻松的解构能力。比如从enum等数据结构中取出数据等等,但是在书写上,相对比较复杂。我们来看一个例子: enum Direction { East, West, North, South, } fn main() { let dire = Direction::South; matc

  • Rust 有一个叫做 match 的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成;第十八章会涉及到所有不同种类的模式以及它们的作用。match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。 可以把 match 表达式想象成某种硬币分类器:硬币滑入有着不同大小孔洞的轨道,每一