12

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?

Renz Manacmol
  • 869
  • 12
  • 27
  • This question has already been answered [here](http://stackoverflow.com/questions/26245139/how-to-create-recyclerview-with-multiple-view-type?rq=1) and several other places. – nebuchadnezzar I Jan 20 '17 at 22:58
  • 2
    Yes.. but i dont see any post with databinding – Renz Manacmol Jan 20 '17 at 23:00
  • Possible duplicate of [How to create RecyclerView with multiple view type?](http://stackoverflow.com/questions/26245139/how-to-create-recyclerview-with-multiple-view-type) – vilpe89 Jan 21 '17 at 00:13

1 Answers1

27

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;
        } 
    }
}
macros013
  • 739
  • 9
  • 10
  • Great! How do I take the instance of the binding from the ViewHolder which isn't null? – Mohsin Falak Sep 22 '20 at 00:09
  • @MohsinFalak you can have getters for the binding references or make them public. – macros013 Sep 23 '20 at 04:56
  • The issue is, I have multiple bindings (for message list, one is right oriented and the other is left, no other difference) for the same ViewHolder and I want to access the active binding outside the viewholder, how do I do that? – Mohsin Falak Sep 28 '20 at 21:42
  • Could you add a (simplified) piece of code for your case? – macros013 Sep 30 '20 at 11:21
  • Kindly take a look at this: https://stackoverflow.com/questions/64164201/android-recyclerview-how-to-handle-viewholder-with-multiple-bindings – Mohsin Falak Oct 02 '20 at 00:25