当高度为 match_parent 时,回收器查看奇怪的行为
Posted
技术标签:
【中文标题】当高度为 match_parent 时,回收器查看奇怪的行为【英文标题】:Recycler view strange behaviour when height is match_parent 【发布时间】:2020-09-16 02:47:17 【问题描述】:我现在面临着一种奇怪的行为。我正在使用视图绑定来引用 id。当 RecyclerView 高度为 wrap_content 时,项目显示完美,但是当我设置 recyclerview 高度 match_parent 时,项目宽度在运行时自动包装(wrap_content),但在 xml 中我已将项目宽度设置为 match_parent。
请帮我解决这个问题。
请看我的xml和kt文件-:
<LinearLayou ------
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/idRvTrainerReview"
android:layout_
android:layout_/>
</LinearLayout>
row_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:layout_marginTop="@dimen/_1sdp"
android:background="@color/colorWhite"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="@dimen/_10sdp">
<TextView
android:id="@+id/idTvDate"
style="@style/MediumText"
android:layout_
android:layout_
android:layout_weight="1"
android:text="14 feb"
android:includeFontPadding="false"
android:textColor="@color/colorBlack"
android:textStyle="bold" />
<TextView
android:id="@+id/idTvStartTime"
android:layout_
android:layout_
android:layout_weight="0.2"
android:gravity="center"
android:includeFontPadding="false"
android:text="19:30" />
<ImageView
android:layout_
android:layout_
android:src="@drawable/ic_right_arrow" />
</LinearLayout>
适配器文件-:
class FeedbackDataAdapter(
private var mcontext: Context,
private var mItemList: MutableList<ResponseTrainerFeedback.Result.Training>,
var mClickListener: OnClickListener?
) : RecyclerView.Adapter<TrainingDataViewHolder>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrainingDataViewHolder
var layoutInflater = mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as (LayoutInflater)
val rowEventMemberBinding =
RowEventDataBinding.inflate(layoutInflater, parent, false)
return TrainingDataViewHolder(rowEventMemberBinding)
override fun getItemCount(): Int = mItemList.size
override fun onBindViewHolder(holder: TrainingDataViewHolder, position: Int)
holder.mBinding.idTvDate.text = mItemList[holder.adapterPosition].trainingName
holder.mBinding.idTvStartTime.invisible()
holder.itemView.setOnClickListener
if(mItemList.size > 0)
mClickListener?.onItemClick(holder.adapterPosition)
fun refreshList(mFeedbackList: MutableList<ResponseTrainerFeedback.Result.Training>)
this.mItemList = mFeedbackList
notifyDataSetChanged()
class TrainingDataViewHolder(var mBinding: RowEventDataBinding) :
RecyclerView.ViewHolder(mBinding.root)
【问题讨论】:
你能添加你的适配器的完整版本吗?我不明白您为什么要在适配器中简单地使用LayoutInflater.from(parent.context)
时调用 mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as(LayoutInflater)
我都使用过,但我得到相同的结果也添加了适配器代码。
【参考方案1】:
我已经尝试过您的代码并且它正在工作。
我只根据Android training重构了你的适配器,如果你想做codelab:https://codelabs.developers.google.com/codelabs/kotlin-android-training-diffutil-databinding
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrainingDataViewHolder
return TrainingDataViewHolder.from(parent)
override fun getItemCount(): Int = mItemList.size
override fun onBindViewHolder(holder: TrainingDataViewHolder, position: Int)
holder.bind(mItemList[position])
holder.itemView.setOnClickListener
if(mItemList.size > 0)
mClickListener?.onItemClick(holder.adapterPosition)
fun refreshList(mFeedbackList: MutableList<ResponseTrainerFeedback.Result.Training>)
this.mItemList = mFeedbackList
notifyDataSetChanged()
class TrainingDataViewHolder(var mBinding: RowEventDataBinding) :
RecyclerView.ViewHolder(mBinding.root)
fun bind(data: YOURDATA)
mBinding.idTv = data // it'll map automatically all the property, replace idTv by the name of your variable in your layout
mBinding.idTvStartTime.invisible()
companion object
fun from(parent: ViewGroup): TrainingDataViewHolder
return TrainingDataViewHolder(RowEventDataBinding.inflate(LayoutInflater.from(parent.context), parent, false))
row_item
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="idTv"
type="package.name.to.data" />
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:layout_marginTop="1dp"
android:background="@android:color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:id="@+id/idTvDate"
android:layout_
android:layout_
android:layout_weight="0.8"
android:text="@idTv.idTvDate"
android:includeFontPadding="false"
android:textColor="@android:color/black"
android:textStyle="bold"
tools:text="14 feb"/>
<TextView
android:id="@+id/idTvStartTime"
android:layout_
android:layout_
android:layout_weight="0.2"
android:gravity="center"
android:includeFontPadding="false"
android:text="19:30" />
<ImageView
android:layout_
android:layout_
android:src="@android:drawable/arrow_up_float" />
</LinearLayout>
</layout>
PS:我在您的row_item
中没有看到<layout>
,您确定您的绑定正确吗?
【讨论】:
我没有使用数据绑定,所以我不需要在 xml 中添加布局标签。我正在使用视图绑定。请查看 viewBinding。 这个val rowEventMemberBinding = RowEventDataBinding.inflate(layoutInflater, parent, false)
来自databinding
:developer.android.com/topic/libraries/data-binding/…
在视图绑定中也一样。您可以查看视图绑定的文档。文件名是 row_event_data,这就是它生成 RowEventDataBinding 的原因。如果文件名是row_event,那么它将生成RowEventBinding。
哦,确实,我学到了一些东西,我的错,但是正如您在屏幕上看到的那样,您的布局完全没问题。您的 recyclerview
是否嵌套在 view
中?
是的,我在回收站视图中到处都有这个问题,所以我必须在回收站视图中设置高度 wrap_content 才能正常工作。以上是关于当高度为 match_parent 时,回收器查看奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
如何将列最大高度限制为屏幕高度?即让孩子“match_parent”大小