【发布时间】:2021-08-07 14:09:34
【问题描述】:
所以我在我的 recyclerview 适配器中使用viewbinding,这里是代码 sn-p。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FeedItemsViewHolder {
val viewHolder = FeedItemsViewHolder(ItemBinding.inflate(LayoutInflater.from(parent.context)))
viewHolder.itemView.setOnClickListener { itemClickListener.onItemClick(it.tag as Item) }
return viewHolder
}
当我用它来膨胀recylerview 时,布局显示得很奇怪。这是截图
但是,当我正常膨胀 recyclerview 时,布局会正确显示。这是代码sn-p和截图
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FeedItemsViewHolder {
val viewHolder =
FeedItemsViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false))
viewHolder.itemView.setOnClickListener { itemClickListener.onItemClick(it.tag as Item) }
return viewHolder
}
问题是我在onCreateViewHolder 中使用视图绑定引起的。没有其他任何改变,例如布局文件等
我错过了什么?
【问题讨论】:
-
您还应该有一个
ItemBinding.inflate()重载,它也采用父ViewGroup。你想改用那个,就像你正常充气时一样。 -
试过了,效果很好。谢谢。那么为什么安卓会这样做呢?在一个项目中,我没有使用重载版本,并且项目显示得很好。这次不是?
-
因为您使用的 inflate 方法假定其膨胀的布局是根(它没有父级),但是任何不是根布局的东西最终都需要附加到父级,以便正确放置和测量作为视图层次结构的一部分,它之前“工作”正常的事实只是基于您之前使用的布局。
-
我无法在没有看到的情况下评论其他项目,但如果可能的话,您通常总是希望将父级
ViewGroup提供给LayoutInflater。如果你不这样做,基本上会发生的情况是根<View>上的所有android:layout_*属性都被忽略了,你最终会得到任何特定的ViewGroup作为其默认值,对于RecyclerView包装宽度和高度。 -
绑定的根视图和整个视图层次结构的根,以及父视图组可能是也可能不是不同的东西 - 取决于上下文 - 子绑定可以并且应该将自己附加到直接父视图组.视图绑定很棒,但是在使用视图绑定 api 时需要了解视图系统的一些细微差别。 @迈克M。为您提供了对正在发生的事情的更规范的概述。
标签: android android-recyclerview android-adapter android-viewbinding