Search code examples
androidandroid-studioandroid-recyclerviewandroid-adapterandroid-databinding

Android recyclerview adapter with multiple viewtype using databinding


Is it possible to create a multiple view type in my adapter.. like adding a view for my header then below the header is a list.

code snippet of my adapter :

 public class StoreAdapter extends RecyclerView.Adapter<StoreAdapter.BindingHolder> {
    
        List<Store> mStoreList;
    
        public class BindingHolder extends RecyclerView.ViewHolder {
            private ViewDataBinding binding;
            public BindingHolder(View v) {
              

  super(v);
            binding = DataBindingUtil.bind(v);
        }
        public ViewDataBinding getBinding() {
            return binding;
        }
    }

    public StoreAdapter(List<Store> storeList) {
        this.mStoreList = storeList;
    }

    @Override
    public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row_store, parent, false);
        BindingHolder holder = new BindingHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(BindingHolder holder, int position) {
        final Store store =  mStoreList.get(position);
        holder.getBinding().setVariable(BR.store, store);
        holder.getBinding().executePendingBindings();
    }

    @Override
    public int getItemCount() {
        return mStoreList.size();
    }
}

more details:

currently my adapter only supports 1 view type. Will it be possible to add another view type that can support databinding as well?


Solution

  • It is possible to use several bindings in one ViewHolder. Here is an example of the adapter with 2 types of items:

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    
        private static final int CELL_TYPE_HEADER = 0;
        private static final int CELL_TYPE_REGULAR_ITEM = 1;
    
        class MyViewHolder extends RecyclerView.ViewHolder {
            private HeaderBinding headerBinding;
            private RegularItemBinding regularItemBinding;
    
            MyViewHolder(HeaderBinding binding) {
                super(binding.getRoot());
                headerBinding = binding;
            }
    
            MyViewHolder(RegularItemBinding binding) {
                super(binding.getRoot());
                regularItemBinding = binding;
            }
        }
    
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            ViewDataBinding binding;
            switch (viewType) {
                case CELL_TYPE_HEADER:
                    binding = DataBindingUtil.inflate(inflater, R.layout.header, parent, false);
                    return new MyViewHolder((HeaderBinding) binding);
                case CELL_TYPE_REGULAR_ITEM:
                    binding = DataBindingUtil.inflate(inflater, R.layout.regular_item, parent, false);
                    return new MyViewHolder((RegularItemBinding) binding);
            }
            return null;
        }
    
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            MyViewModel viewModel = new MyViewModel(getItem(position));
            switch (holder.getItemViewType()) {
                case CELL_TYPE_HEADER:
                    HeaderBinding headerBinding = holder.headerBinding;
                    viewModel.setSomething(...);
                    headerBinding.setViewModel(viewModel);
                    break;
                case CELL_TYPE_REGULAR_ITEM:
                    RegularItemBinding regularItemBinding = holder.regularItemBinding;
                    viewModel.setSomething(...);
                    regularItemBinding.setViewModel(viewModel);
                    break;
            }
        }
    
        @Override
        public int getItemViewType(int position) {
            if (position == 0) {
                return CELL_TYPE_HEADER;
            } else {
                return CELL_TYPE_REGULAR_ITEM;
            } 
        }
    }