How can i change findViewById to view binding?

Viewed 519

Here it's my adapter code ;

    class ModelViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    private val chName: TextView = view.findViewById(R.id.chName)
    private val chBirthYear: TextView = view.findViewById(R.id.chBirthYear)
    private val chHeight: TextView = view.findViewById(R.id.chHeight)
    private val chHomeWorld: TextView = view.findViewById(R.id.chHomeWorld)
3 Answers

Get the list item view binding class and change it like this:

//ItemModelBinding is the generated binding class for the list view item
class ModelViewHolder(val binding: ItemModelBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(item: SomeModelClass) {
            binding.chName = item.chName
            binding.chBirthYear = item.chBirthYear
            binding.chHeight = item.chHeight
            binding.chHomeWorld= item.chHomeWorld
            
            binding.executePendingBindings()
        }
override fun onBindViewHolder(holder: ModelViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(item)
    }
class ModelViewHolder(view: View) RecyclerView.ViewHolder(view){
    val binding = LayoutYouWantToUseBinding.bind(view)
}

ListAdapter is RecyclerView.Adapter base class for presenting List data in a RecyclerView, including computing diffs between Lists on a background thread.

DiffUtil helps in computing the difference between two lists on a background thread. and only update the view for which data has been changed means less number of call of onBindViewHolder() which would have called for all the item if we still stick with notifyDataSetChanged() on any data change.

class ModelAdapter : ListAdapter<Model, ModelAdapter.ModelViewHolder>(ModelDiffCallBack()) {

    class ModelViewHolder(private val binding: ModelItemLayoutBinding) :
    RecyclerView.ViewHolder(binding.root) {

    fun bind(model: Model) {
        //if data binding is also enabled
        binding.model = model
        //else set data for each view one after another
        binding.txtTitle.text = model.title
        //and so on for all the items
        
        
        binding.executePendingBindings()
    }

    companion object {
        fun from(parent: ViewGroup): ModelViewHolder {
            val layoutInflater = LayoutInflater.from(parent.context)
            val binding = ModelItemLayoutBinding.inflate(layoutInflater, parent, false)
            return ModelViewHolder(binding)
        }
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ModelViewHolder =
    ModelViewHolder.from(parent)

override fun onBindViewHolder(holder: ModelViewHolder, position: Int) {
    val model = getItem(position)
    holder.bind(model)
}

class ModelDiffCallBack : DiffUtil.ItemCallback<Model>() {
    override fun areItemsTheSame(oldItem: Model, newItem: Model): Boolean =
        oldItem === newItem

    override fun areContentsTheSame(oldItem: Model, newItem: Model): Boolean =
        oldItem == newItem
}

}
Related