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
相关产品推荐
相关产品推荐

