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

RecyclerView用ViewBinding时Item与findViewById显示效果不一致

问题现象
  • 使用常规findViewById方案编写RecyclerView Adapter时,Item显示效果完全正常
  • 切换为ViewBinding方案实现Adapter后,Item布局出现显示异常

当前使用的ViewBinding版Adapter代码如下:

class HomePageFoldersAdapter() : RecyclerView.Adapter<HomePageFoldersAdapter.FolderHolder>() {

var list = emptyList<Folder>()
    set(value) {
        field = value
        notifyDataSetChanged()
    }

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FolderHolder {
    val inflater = LayoutInflater.from(parent.context)
    val binding = FolderHomeCardBinding.inflate(inflater)
    return FolderHolder(binding)
}

override fun onBindViewHolder(holder: FolderHolder, position: Int) {
    val folder = list[position]
    with(holder.binding) {
        val context = root.context
        nameTextView.text = folder.name
        sizeTextView.text = context.getString(R.string.modules_count, folder.modulesIds.size)
    }
}

override fun getItemCount() = list.size

class FolderHolder(val binding: FolderHomeCardBinding) : RecyclerView.ViewHolder(binding.root)

}
问题原因

核心错误出在onCreateViewHolder的布局填充逻辑:调用ViewBinding的inflate方法时仅传入了LayoutInflater实例,没有传入父布局parent,也没有指定attachToRoot参数。这种加载方式会导致Item根布局丢失RecyclerView要求的布局参数(包括宽高规则、边距等),最终出现尺寸错乱、布局错位的显示异常。

修复方案

仅需修改onCreateViewHolder中的inflate调用,补全三个参数即可,其余逻辑无需改动:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FolderHolder {
    val inflater = LayoutInflater.from(parent.context)
    // 补全parent、attachToRoot=false两个参数
    val binding = FolderHomeCardBinding.inflate(inflater, parent, false)
    return FolderHolder(binding)
}

修改后ViewBinding版本的Item显示效果会和之前findViewById版本完全一致。


内容的提问来源于stack exchange,提问作者Константин Актыбаев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:57:51