如何在 recyclerview android 中填充项目宽度 children

How to fill item width children in reyclerview android

嘿,我在 android 工作。我想将 children 放入 recyclerview android 的整个视图中。我有水平回收视图。我会在图表中展示我想要的。

场景一

当我在回收站视图中有更多项目时,我想在我的回收站视图中像这样显示 children。

预期输出

场景二

当我有 三个 项时,我想这样显示。它将填满 reyclerview 中的整个视图。

预期输出

场景三

当我在 reyclerview 中有 两个 项时,我需要看起来像这样

预期输出

我遇到的问题是我有 3 个项目,视图没有完全填满。实际上我想将整个视图拉伸到全宽,如 场景 2

实际产量

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="10dp"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@drawable/drawable_selector"
        android:orientation="vertical">

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp" />

        <TextView
            android:id="@+id/subText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_marginEnd="10dp"
            android:layout_marginBottom="10dp" />

    </LinearLayout>

    <RelativeLayout
        android:id="@+id/tagContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:visibility="gone">

        <TextView
            android:id="@+id/tagText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingStart="10dp"
            android:paddingEnd="10dp" />

    </RelativeLayout>

</FrameLayout>

更新

在@Cheticamp 的建议下我做了这个代码

companion object {
        fun bindView(parent: ViewGroup): XYZViewHolder {
            val view = XyzLayoutBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
            val lp = view.container.layoutParams
            lp.width = parent.measuredWidth / 3
            return OptionsViewHolder(
                view
            )
        }
    }

如您所见,我的最后一项从末尾被剪掉了。

我认为在我的框架布局中我使用了 marginEnd 10 dp 是否会导致问题?如果您需要更多,请参考我的布局。还有一件事我没有划分 framelayout 而是我将线性布局作为 container。我正在添加我的 github link.

自定义框架布局class 使 class 继承 FrameLayout 或您使用的其他布局。

    public class SquareFrameLayout extends FrameLayout {
    public SquareFrameLayout(@NonNull Context context) {
        super(context);
    }

    public SquareFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public SquareFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public SquareFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
}

onMeasure 方法很重要。

然后将根布局项recyclerView 更改为SquareFrameLayout(class 已建) 像这样:

<com.example.app.SquareFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/background_rv_item"
    android:orientation="vertical"
    android:padding="16dp"
    android:layout_margin="4dp"
    xmlns:tools="http://schemas.android.com/tools">

   
   //your items

</com.example.app.SquareFrameLayout>

您可以在 onCreateViewHolder() 中更改 RecyclerView 项目视图的宽度。 ViewGroup 父级是 RecyclerView

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.item_view, parent, false)
    val lp = view.layoutParams
    // Change the width of the item view here
    lp.width = parent.measuredWidth / 3 // width is 1/3 of the width of the RecyclerView
    return ItemViewHolder(view)
}

您可以使用 Google 提供的 flexbox-layout 库。 您可以根据需要调整项目。 下载该应用程序并查看此演示是否适合您。 https://github.com/google/flexbox-layout