如何在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
相关产品推荐
相关产品推荐

