【问题标题】:Using ViewBinding in recyclerview adapter wierldly displays items?在 recyclerview 适配器中使用 ViewBinding 奇怪地显示项目?
【发布时间】: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


【解决方案1】:

这是一个为 RecyclerView 适配器工作的 ViewBinding 示例

class SampleViewHolder (rootItemView: StorefrontCategoryItemBinding) : RecyclerView.ViewHolder(**rootItemView.root**) {
    val rootView = rootItemView.rootViewItem

}

在适配器中

  override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): SampleViewHolder {

        return SampleViewHolder (StorefrontCategoryItemBinding.inflate(context.layoutInflater))
    }

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2017-02-24
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多