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,提问作者Константин Актыбаев
相关产品推荐
相关产品推荐

