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

如何在RecyclerView.Adapter中正确使用View Binding完成控件绑定?

问题核心说明

你在Activity中使用的那两行代码,只有inflate逻辑可以调整后用到Adapter中,setContentView是Activity专属API,Adapter场景下完全不需要使用,直接删除即可。
原有代码的核心错误有3点:

  • 全局声明唯一的binding实例:每个列表项对应独立的binding实例,全局共用会导致列表滚动时内容错乱
  • 重复inflate布局:同时调用binding.inflate和LayoutInflater.inflate加载同一布局,属于冗余操作
  • 错误调用setContentView:该方法仅用于Activity设置页面根布局,Adapter中无该API也不需要用到
改造后可直接运行的完整代码
class WorkoutAdaptor (
    var workouts: List<Workout>
) : RecyclerView.Adapter<WorkoutAdaptor.WorkoutViewHolder>() {

    // 把binding放到ViewHolder内部持有,每个ViewHolder对应一个独立binding实例
    inner class WorkoutViewHolder(val binding: WorkoutCardBinding) : RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {
        // 调整inflate参数,传入parent和attachToRoot=false,符合RecyclerView item的加载规则
        val binding = WorkoutCardBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return WorkoutViewHolder(binding)
    }

    override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
        val currentWorkout = workouts[position]
        // 直接用holder里的binding操作控件即可
        holder.binding.tvWorkoutCard.text = currentWorkout.xxx // 这里补全你要取的Workout属性即可
        // 其他控件的赋值也都用holder.binding.xxx来操作
    }

    override fun getItemCount(): Int = workouts.size
}
额外说明

如果需要给item设置点击事件,也可以在ViewHolder初始化或者onBindViewHolder中通过holder.binding.root.setOnClickListener来设置即可。

内容的提问来源于stack exchange,提问作者Eleris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:06:03