-1

I created a simple RecycleView with a single ViewHolder but then I wanted to add another one and display them in the same recyclerView and so I had to make another ViewHolder.

I tried to follow this advice: How to set two adapters to one RecyclerView?
He tried to make a simple bind method but that didn't work for me.

It says that I should display an object of the ViewHolder, but how do I do that?

Thanks for any in advice.

Code:

some package, imports; *

public class MultiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static class FirstViewHolder extends RecyclerView.ViewHolder{

        TextView second_segment;

        private FirstViewHolder( View itemView) {
            super(itemView);
            second_segment = itemView.findViewById(R.id.segment_tuesday);

        }
        **private void bind(MultiAdapter firstObj) {
            Exercise exercise = new Exercise();
            //firstObj = exercise;
        }**
    }
    public static class SecondViewHolder extends RecyclerView.ViewHolder {
        TextView first_segment;

        private SecondViewHolder( View itemView) {
            super(itemView);
            first_segment = itemView.findViewById(R.id.segment_monday);

        }
        **private void bind(MultiAdapter secondObj) {
            Exercise exercise = new Exercise();
            //secondObj = exercise;
        }**
    }


    private static int ITEM_TYPE_C_T;
    private static int ITEM_TYPE_S_B;


    private List<Object> items = new ArrayList<>();

    public MultiAdapter(List<Object> items){
        this.items.addAll(items);
    }

    @Override
    public int getItemViewType(int position) {
        if (items.get(position) instanceof MultiAdapter) {
            return ITEM_TYPE_C_T;
        }
        else{
            return ITEM_TYPE_S_B;
        }
    }

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

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());

        if (viewType == ITEM_TYPE_S_B){
            View view = layoutInflater.inflate(R.layout.segment_exmpl1,parent,false);
            return new SecondViewHolder(view);
        } else {
            View view = layoutInflater.inflate(R.layout.segment_exmpl2,parent,false);
            return new FirstViewHolder(view);
        }
    }

    @Override
    **public void onBindViewHolder(@NonNull RecyclerView.ViewHolder Holder, int position) {
        Object item = items.get(position);
        if (Holder instanceof FirstViewHolder) {
            FirstViewHolder viewHolder0 = (FirstViewHolder) Holder;
            //((FirstViewHolder) Holder).bind((FirstObj) item);
        } else {
            SecondViewHolder viewHolder0 = (SecondViewHolder) Holder;
            //((SecondViewHolder) Holder).bind((SecondObj) item);
        }
    }**



}
Kristian
  • 165
  • 2
  • 16

1 Answers1

1

In Activty/Fragment, prepare your model object with an id.

private  void prepareDataSet(){
         List<Object> items = new ArrayList<>();
         items.add(new Object(id1));
         items.add(new Object(id2));
         items.add(new Object(id1));
         items.add(new Object(id2));
         multiAdapter.notifyDataSetChanged();

}

In Adapter class, modify your logic as follows

 @Override
    public int getItemViewType(int position) {
        if (items.get(position).id=id1) {
            return ITEM_TYPE_C_T;
        }
        else if(items.get(position).id=id2){
            return ITEM_TYPE_S_B;
        }else {
            return DEFAULT_VIEW;
        }
    }



@NonNull
    @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());

            if (viewType == ITEM_TYPE_S_B){
                View view = layoutInflater.inflate(R.layout.segment_exmpl1,parent,false);
                return new SecondViewHolder(view);
            } else if(viewType == ITEM_TYPE_S_B) {
                View view = layoutInflater.inflate(R.layout.segment_exmpl2,parent,false);
                return new FirstViewHolder(view);
            }else{
    //to prevent crash on null
                View view = layoutInflater.inflate(R.layout.default_view,parent,false);
                return new DefaultHolder(view);
    }
        }
kashyap
  • 498
  • 1
  • 6
  • 21