Страницы

Поиск по вопросам

среда, 20 февраля 2019 г.

Как правильно работать со сложным ViewHolder?

Допустим, есть RecyclerView с различными элементами ViewHolder.
В одном типе элементов списка может быть семь виджетов EditText, в другом - другие компоненты. У каждого типа элементов своя логика валидации и прочее.
Стандартное решение - вынести вьюхолдеры в отдельные классы, понятно. Тем не менее, в адаптере будет куча условий if, определяющих, как наполнить вьюхолдер данными, какой вьюхолдер создать для данного типа, и тд.
Затем возникает проблема, что этот же элемент с его небольшой логикой валидации (допустим, что поле не должно начинаться с цифры и содержать меньше 8 символов), мне нужен на другом экране. Да, я могу переиспользовать вьюхолдер, но мне всё равно нужно повторять бойлерплейт с его инициализацией getItemViewType(), onCreateViewHolder()...
Как же лучше организовать связку Адаптер-ВьюХолдер?


Ответ

Посмотрите в сторону решения, описанного в http://hannesdorfmann.com/android/adapter-delegates
Там вводится новая сущность - AdapterDelegate. Делегат позволяет разгрузить ваши адаптеры и ViewHolder, а также сделать их максимально переиспользуемыми, если списков в приложении много. При этом во ViewHolder отсутсвует какая либо логика. Это просто класс-holder ссылок на View элементы (EditText и т.д.). В делегаты вы можете инжектить Презентеры, через которые провайдите действия пользователя.
Однако бывают случаи, когда один элемент списка переиспользуется много где, и в этом элементе выполняется, например, "like". Инжектить Презентер бывает не очень удобно, так как тогда возникает дублирование кода и протягивание лишних зависимостей, чтобы в конце концов выполнить нужный пользовательский сценарий. Поэтому можно заинжектить в данный делегат специальный UseCase (Interactor), который как раз и выполняет пользовательский сценарий - нажатие на кнопку like.

Комментариев нет:

Отправить комментарий