Отображение массивов двух видов в RecyclerView

У меня есть класс Event с параметрами, значение которых неважно. Я хочу показывать в RecyclerView массив Event. Далее, я хочу группировать эти Event и когда нужно показывать в виде [Заголовок, Событие1, Событие2], [Заголовок2, Событие3, Событие4].

Сначала я сделал главный класс MainItem, и Event и Header, преобразуемые в MainItem. Далее я сделал для них Holder'ы, и Адаптер, в котором с помощью двух ViewType'ов отображал массив List<MainItem>, в котором были либо только Event'ы, либо Header'ы и Event'ы.

Мне это показалось довольно костыльным, потому что Header и Event никак не были связаны. Я добавил в класс Header поле массив List<Event> для отображения событий, связанных с заголовком. Пришлось делать второй адаптер для RecyclerView класса Header и его Event'ов. В главном адаптере с помощью двух View Type я отображаю либо Заголовок с Событиями, либо просто События.

Меня смущает то, что у меня в итоге получилось два адаптера. Есть ли более оптимальный способ это всё организовать? Готовые пакеты типа Expandable Recycler View не предлагать.

Ниже привожу код:

Адаптер событий с заголовком:

public class EventAdapter extends RecyclerView.Adapter<EventHolder> {

    private List<EventItem> subItemList;

    EventAdapter(List<EventItem> subItemList) {
        this.subItemList = subItemList;
    }

    @NonNull
    @Override
    public EventHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_sub_item, viewGroup, false);
        return new EventHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull EventHolder subItemViewHolder, int i) {
        EventItem subItem = subItemList.get(i);

        subItemViewHolder.tvSubItemTitle.setText(subItem.getEventItemTitle());
        subItemViewHolder.tvSubItemDescr.setText(subItem.getEventItemDesc());
    }

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

Главный адаптер:

public class MainAdapter extends RecyclerView.Adapter<MainViewHolder> {

    private RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
    private List<MainItem> itemList;
    private Context context;

    MainAdapter(Context context, List<MainItem> itemList) {
        this.context = context;
        this.itemList = itemList;
    }

    @NonNull
    @Override
    public MainViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        //View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_item, viewGroup, false);
        View view;
        switch (i){
            case (Constants.ITEM_HEADER_TEXT_VIEWTYPE):
                view = LayoutInflater.from(context).inflate(R.layout.layout_item, viewGroup, false);
                return new HeaderHolder(view);
            case (Constants.ITEM_EVENT_TEXT_VIEWTYPE):
                view = LayoutInflater.from(context).inflate(R.layout.layout_sub_item, viewGroup, false);
                return new EventHolder(view);
            default: throw new IllegalArgumentException();
        }
    }

    @Override
    public void onBindViewHolder(@NonNull MainViewHolder itemViewHolder, int i) {


        if (itemViewHolder.getItemViewType() == Constants.ITEM_HEADER_TEXT_VIEWTYPE){
            ((HeaderHolder)(itemViewHolder)).setData(itemList.get(i));
            HeaderItem item = itemList.get(i).getHeaderItem();


            // Create layout manager with initial prefetch item count
            LinearLayoutManager layoutManager = new LinearLayoutManager(
                    ((HeaderHolder)(itemViewHolder)).rvSubItem.getContext(),
                    LinearLayoutManager.VERTICAL,
                    false
            );
            layoutManager.setInitialPrefetchItemCount(item.getEvents().size());

            // Create sub item view adapter
            EventAdapter subItemAdapter = new EventAdapter(item.getEvents());

            ((HeaderHolder)(itemViewHolder)).rvSubItem.setLayoutManager(layoutManager);
            ((HeaderHolder)(itemViewHolder)).rvSubItem.setAdapter(subItemAdapter);
            ((HeaderHolder)(itemViewHolder)).rvSubItem.setRecycledViewPool(viewPool);
        }
        else{
            ((EventHolder)(itemViewHolder)).setData(itemList.get(i));

        }


    }

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

    @Override
    public int getItemViewType(int position) {
        return itemList.get(position).getViewType();
    }
}

Ответы (0 шт):