How to use Android View Binding with RecyclerView How to use Android View Binding with RecyclerView xml xml

How to use Android View Binding with RecyclerView


Let's say we have a RecyclerView inside activity_main.xml and its id is "@+id/rv_test"

Inside the Activity we can use it like so:

public class MainActivity extends Activity{    ActivityMainBinding binding; //Name of the layout in camel case + "Binding"    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        binding = ActivityMainBinding.inflate(getLayoutInflater());        setContentView(binding.getRoot());        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);        binding.rvTest.setLayoutManager(layoutManager);    }}

Let's name the layout for RecyclerView items test_list_item.xml

Then we can implement our adapter inside Activity like this:

public class MainActivity extends Activity{    ActivityMainBinding binding; //Name of the layout in camel case + "Binding"    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        binding = ActivityMainBinding.inflate(getLayoutInflater());        setContentView(binding.getRoot());        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);        binding.rvTest.setLayoutManager(layoutManager);        List<String> items = Arrays.asList("item", "item", "item");        binding.rvTest.setAdapter(new MyAdapter(items));    }    private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{        private List<String> items;        private class MyViewHolder extends RecyclerView.ViewHolder{            TestListItemBinding binding;//Name of the test_list_item.xml in camel case + "Binding"            public MyViewHolder(TestListItemBinding b){                super(b.getRoot());                binding = b;            }        }        public MyAdapter(List<String> items){            this.items = items;        }        @NonNull        @Override        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){            return new MyViewHolder(TestListItemBinding.inflate(getLayoutInflater()));        }        @Override        public void onBindViewHolder(MyViewHolder holder, int position){            String text = String.format(Locale.ENGLISH, "%s %d", items.get(position), position);            //An example of how to use the bindings            holder.binding.tvTest.setText(text);        }        @Override        public int getItemCount(){            return items.size();        }    }}


class LanguageAdapter(val context: Context, var listData: MutableList<ListData>, val listener: onCheckListner) : RecyclerView.Adapter<LanguageAdapter.ViewHolder>() {lateinit var bindind: LangugaeItemBindingfun onRefresh(listData: MutableList<ListData>) {    this.listData = listData    notifyDataSetChanged()}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {    bindind = LangugaeItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)    return ViewHolder(bindind)}override fun getItemCount(): Int {    return listData.size}override fun onBindViewHolder(holder: ViewHolder, position: Int) {    holder.setData(listData[position])}inner class ViewHolder(private val binding: LangugaeItemBinding) : RecyclerView.ViewHolder(binding.getRoot()), View.OnClickListener {    override fun onClick(v: View?) {        when (v) {            itemView -> {            }        }    }    init {        itemView.radio_button.setOnClickListener(this)    }    fun setData(model: ListData) {        with(binding) {            data = model            executePendingBindings()        }    }}}

just pass the model or arraylist into adapter and set in binding view


Here is full adapter code by using view binding, you can do like this.

package com.jbws.myviewbindingdemo.adapter;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import androidx.annotation.NonNull;import androidx.recyclerview.widget.RecyclerView;import com.jbws.myviewbindingdemo.databinding.RowXmlViewBinding;import com.jbws.myviewbindingdemo.pojo.ModelObject;import java.util.ArrayList;public class RecyclerViewListAdapter extends RecyclerView.Adapter<RecyclerViewListAdapter.ViewHolder> {    public ArrayList<ModelObject> modelObjectArrayList;    public RecyclerViewListAdapter(ArrayList<ModelObject> modelObjectArrayList) {        this.modelObjectArrayList = modelObjectArrayList;    }    @NonNull    @Override    public RecyclerViewListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {        return new ViewHolder(RowXmlViewBinding.inflate(LayoutInflater.from(parent.getContext()),                parent, false));    }    @Override    public void onBindViewHolder(@NonNull RecyclerViewListAdapter.ViewHolder holder, final int position) {        ModelObject modelObject = modelObjectArrayList.get(position);        holder.rowXmlViewBinding.txtObjectName.setText(modelObject.getFullName());        holder.rowXmlViewBinding.btnUpdateName.setOnClickListener(view -> {         Log.i("LOG_TAG", "Full Name: " + modelObject.getFullName);        });    }    @Override    public int getItemCount() {        return modelObjectArrayList == null ? 0 :                modelObjectArrayList.size();    }    public static class ViewHolder extends RecyclerView.ViewHolder {        private RowXmlViewBinding rowXmlViewBinding;        public ViewHolder(RowXmlViewBinding rowXmlViewBinding) {            super(rowXmlViewBinding.getRoot());            this.rowXmlViewBinding = rowXmlViewBinding;        }    }}