Home > Software design >  trying use view binding with recycler view adaptor
trying use view binding with recycler view adaptor

Time:10-02

Where in the code should i be using the following lines to work with my widgets:

binding = WorkoutCardBinding.inflate(layoutInflater)
setContentView(binding.root)

I know it should be used in an activiy's onCreate function but I can't seem to get it to work with the below adapter class

    class WorkoutAdaptor (
    var workouts: List<Workout>
    ) : RecyclerView.Adapter<WorkoutAdaptor.WorkoutViewHolder>() {

    private lateinit var binding: WorkoutCardBinding

    inner class WorkoutViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {

        binding = WorkoutCardBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val view = LayoutInflater.from(parent.context).inflate(R.layout.workout_card, parent, false)
        return WorkoutViewHolder(view)
    }

    override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
            holder.itemView.apply {
            binding.tvWorkoutCard.text = workouts[position].
        }

    }

    override fun getItemCount(): Int {
        return workouts.size
    }

CodePudding user response:

val binding = WorkoutCardBinding.inflate(
           LayoutInflater.from(parent.context), parent, false)

return WorkoutViewHolder(binding)

//Change you onCreateViewHolder completely to this code

CodePudding user response:

You don't have to create a binding variable in the adapter class. To use view binding in recyclerView adapter there are a few things that you've to change.

Firstly, change your viewHolder class constructor to accept viewBinding instead of a view

inner class WorkoutViewHolder(private val workoutCardBinding: WorkoutCardBinding) :
    RecyclerView.ViewHolder(workoutCardBinding.root) {
    fun bind(workout: Workout) {
        workoutCardBinding.apply {
            // create your view here
        }
}

Change onCreateViewHolder, to return a viewHolder object using binding.

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {
    val workoutCardBinding=
        WorkoutCardBinding.inflate(LayoutInflater.from(parent.context), parent, false)

    return WorkoutCardBinding(workoutCardBinding)
}

Your complete adapter class will look like this -

class WorkoutAdaptor (
    var workouts: List<Workout>
) : RecyclerView.Adapter<WorkoutAdaptor.WorkoutViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WorkoutViewHolder {
        val workoutCardBinding =
            WorkoutCardBinding.inflate(LayoutInflater.from(parent.context), parent, false)

        return WorkoutCardBinding(workoutCardBinding)
    }

    override fun onBindViewHolder(holder: WorkoutViewHolder, position: Int) {
        holder.bind(workouts[position])
    }

    override fun getItemCount(): Int {
        return workouts.size
    }

    inner class WorkoutViewHolder(private val workoutCardBinding: WorkoutCardBinding) :
        RecyclerView.ViewHolder(workoutCardBinding.root) {
        fun bind(workout: Workout) {
            workoutCardBinding.apply {
                // create your view here
            }
        }
    }
}
  • Related