You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView列表项宽度未与父布局对齐的问题解决求助

问题:RecyclerView列表项宽度无法匹配父布局

预期效果

预期效果

当前问题

当前问题

相关代码

Adapter代码

class CancelBookingAdapter(
    val data: List<CancelReasonsResponse.Data>,
    val callBack: CancelBookingCallBack
) : RecyclerView.Adapter<CancelBookingAdapter.ViewHolder>() {

    var selectedPosition = -1
    var comments = ""

    class ViewHolder(val binding: CancelAdapterBinding) : RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = CancelAdapterBinding.inflate(LayoutInflater.from(parent.context),null,false)
        val lp = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.binding.apply {
            tvReasonText.text = data[position].title

            if (selectedPosition == -1) {
                comments = ""
            }else {
                comments = data[position].title
            }

            if (selectedPosition == position) {
                llReason.setBackgroundResource(R.drawable.selected_box)
            }else {
                llReason.setBackgroundResource(R.drawable.cancel_outline)
            }

            llReason.setOnClickListener {
                selectedPosition = holder.adapterPosition
                callBack.onClickCheckBox(data[position].id, comments)
                selectedPosition = position
                notifyDataSetChanged()
            }
        }
    }

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

interface CancelBookingCallBack {
    fun onClickCheckBox(reasonId: Int, comment: String)
}

列表项XML代码

<androidx.appcompat.widget.LinearLayoutCompat
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/llReason"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/_12sdp"
        android:gravity="center"
        android:background="@drawable/cancel_outline"
        android:layout_marginBottom="@dimen/_12sdp">

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/tvReasonText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="@font/space_grotesk_bold"
            android:gravity="center"
            android:text="@string/cancel_booking"
            android:textSize="14sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.appcompat.widget.LinearLayoutCompat>

</androidx.appcompat.widget.LinearLayoutCompat>

解决方法

1. 修复ViewHolder布局参数绑定问题

你在onCreateViewHolder中创建了布局参数但未绑定到根视图,导致列表项无法继承父布局宽度。两种修改方式:

// 方式一:inflate时传入parent,自动设置正确参数
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val binding = CancelAdapterBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    return ViewHolder(binding)
}

// 方式二:手动给根视图设置布局参数
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val binding = CancelAdapterBinding.inflate(LayoutInflater.from(parent.context),null,false)
    val lp = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
    binding.root.layoutParams = lp
    return ViewHolder(binding)
}

2. 清理XML无效约束

列表项根布局是LinearLayoutCompat,但TextView使用了ConstraintLayout专属的约束属性(app:layout_constraintXXX),这些属性在LinearLayout中无效,建议删除:

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/tvReasonText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/space_grotesk_bold"
    android:gravity="center"
    android:text="@string/cancel_booking"
    android:textSize="14sp" />

3. 确认RecyclerView本身宽度

检查承载RecyclerView的布局,确保RecyclerView设置了android:layout_width="match_parent",如果RecyclerView本身宽度未撑满父布局,列表项也无法达到预期效果。

内容的提问来源于stack exchange,提问作者Lovish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:25:22