Адаптируем RecyclerView#разработка #библиотека
За последние несколько лет в Android поменялось много вещей. Но одна вещь остается неизменной: нам нужно отобразить пользователям данные в наиболее удобном для них виде. И если этих данных много, то мы используем список. Сегодня есть RecyclerView, которым мы отображаем списки уже несколько лет. Но так ли хорош RecyclerView или есть вещи, которые можно улучшить?
1)
Adapter. Каждый RecyclerView для отображения данных использует адаптер. Если рассмотреть адаптер как паттерн, то это прослойка, которая позволяет интерфейсам уже созданных классов использоваться в других интерфейсах. Все адаптеры используют разные реализации ViewHolder, поэтому адаптер RecyclerView подходит под это определение. Но одной из наиболее известных ошибок, которая встречается в написании адаптеров является бизнес-логика внутри них. Надо помнить, что Adapter — это слой, который связывает логику отображения, и в нем нет места для бизнес-логики.
2) В любом адаптере надо переопределить
много методов:
• установку данных в конструкторе или через сеттер;
• переопределить getItemCount();
• если есть несколько типов данных, то переопределить getItemViewType();
• переопределить onCreateViewHolder();
• ну и напоследок написать onBindViewHolder();
Если типов данных в списке много, то количество кода увеличивается. А с появлением нескольких адаптеров повторяющегося кода становится в разы больше.
3)
DiffUtil — это класс, который решает проблему установки новых данных в адаптер, изменяя только те данные, которые нужно. Но недостаток в том же, что и во втором пункте: повторяющийся код. Для каждого Callback надо переопределить areItemsTheSame() и areContentsTheSame() и число этих методов растет в зависимости от числа типов элементов.
Этот список можно продолжать и дальше, ведь мы не касались обработки пустого списка, пагинации, выбора данных и прочих распространенных вещей.
Для решения этих и других проблему, рекомендую библиотеку
OneAdapter, которая убирает большинство из этих недостатков. В ее основе лежит подход в создании модулей для биндинга ViewHolder, кликов, пагинации. Подробнее о библиотеке можно почитать в этой
статье.