首页 > 解决方案 > 对具有不同方向的多个 RecyclerView 使用相同的布局

问题描述

我得到了 2 RecyclerViews 都使用相同的 layout.xml 文件ViewHolder

我设置了一个静态layout_width,它适用于水平滚动 RecyclerView,下面的 xml 代码

rvFirst.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)

在此处输入图像描述

但是第二个垂直滚动的 RecyclerView,其中单元格的宽度没有覆盖父级,

是否可以使用与下面相同的布局文件并能够更改layout_width为匹配/填充父级?

在此处输入图像描述

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/_150sdp"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/activity_vertical_margin"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tvTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/separator"
            android:ellipsize="end"
            tools:text="Title"
            android:maxLines="1"
            android:textSize="@dimen/normal_text_size" />

        <TextView
            android:id="@+id/tvDescrip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="1"
            tools:text="Description"
            android:textSize="@dimen/small_text_size" />

    </LinearLayout>
</androidx.cardview.widget.CardView>

我可以将isVertical: Boolean参数传递给适配器和 ViewHolder,但我不知道应该在哪里更改布局

class CustomAdapter(val items: ArrayList<Item>, val isVertical: Boolean = false): RecyclerView.Adapter<CustomViewHolder>() {

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder {
        val view = LayoutInflater.from(p0.context).inflate(R.layout.item_layout, p0, false)
        return CustomViewHolder(view, isVertical)
    }

    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(p0: CustomViewHolder, p1: Int) {
        items.getOrNull(p1)?.let {
            p0.bindData(it)
        }
    }
}

class CustomViewHolder(val view: View, isVertical: Boolean) : RecyclerView.ViewHolder(view) {

    private val tvTitle: TextView = view.findViewById(R.id.tvTitle)
    private val tvDescrip: TextView = view.findViewById(R.id.tvDescrip)

    fun bindData(item: Item) {
        tvTitle.text = "Title"
        tvDescrip.text = "Description"
    }
}

标签: androidkotlinandroid-recyclerview

解决方案


在您的 viewholder 内,您必须测试方向(您可以将其作为变量传递给您的适配器),然后:

val view = LayoutInflater.from(p0.context).inflate(R.layout.item_layout, p0, false)
if(isVertical){
// width,height
view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}else{
// Here you need to use your 250dp,
// You have to convert the code to Kotlin
float width = getResources().getDimension(R.dimen._150sdp);
view.setLayoutParams(new LayoutParams(width, LayoutParams.WRAP_CONTENT));
}
// No need to pass isVertical to the view holder
return CustomViewHolder(view, isVertical)


推荐阅读