Почему RecyclerView Adapter - это универсальный класс

Class signature is RecyclerView.Adapter<"VH extends android.support.v7.widget.RecyclerView.ViewHolder">. VH type is bounded by RecyclerView.ViewHolder.

Поскольку RecyclerView.ViewHolder является абстрактным классом, любой экземпляр VH наследуется RecyclerView.ViewHolder.

Например, метод onCreateViewHolder возвращает объект универсального типа VH, который в любом случае наследуется от RecyclerView.ViewHolder. Так почему бы просто не сделать RecyclerView.ViewHolder как возвращаемый тип (вместо универсального типа VH) и не сделать все это без универсального стиля?

Держатель вида образца дизайна: Удерживать объекты просмотра в держателе представления

Vadim Eksler 14.08.2018 12:37

а это ссылка на сайт

Vadim Eksler 14.08.2018 12:40

Я понимаю шаблон View Holder. Я не понимаю, почему Google разработал RecyclerView.Adapter как общий класс.

Johnny Blade 14.08.2018 12:54

см., например, метод onBindViewHolder, он передает ваш собственный ViewHolder в качестве параметра, и вам не нужно использовать какие-либо приведения - то же самое относится ко многим другим методам Adapters

pskink 14.08.2018 12:55

В любом случае мой пользовательский ViewHolder является производным от RecyclerVIew.ViewHolder. Поэтому, если бы это был RecyclerVIew.ViewHolder вместо VH (общий) в качестве параметра передачи в этих методах, проблем с приведением не возникло. Если я правильно понял, проблем не будет, отправить экземпляр производного класса вместо базы.

Johnny Blade 14.08.2018 13:33

Теперь пользователю придется вручную отливать держатель, даже если у вас в адаптере был только 1 подтип viewholder.

EpicPandaForce 14.08.2018 13:35

Вы можете передать RecyclerView.ViewHolder, если хотите, но вам нужно выполнить приведение типов, если вы хотите использовать свой собственный держатель. Кроме того, это полезно, когда вам нужно использовать несколько ViewHolder для одного адаптера.

mujeeb.omr 14.08.2018 13:36

Теперь я вижу. Это необходимо при переопределении onBindViewHolder при вызове пользовательских методов ViewHolder. Вы мне помогли, большое спасибо!

Johnny Blade 14.08.2018 13:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
639
1

Ответы 1

Потому что вы хотите, чтобы ваш подкласс RecyclerView.Adapter имел дело только с определенным типом ViewHolder.

Вот почему сигнатура класса позволяет вам указать тип VH. Так что класс будет смоделирован в соответствии с вашими потребностями; методы onBindViewHolder, onCreateViewHolder будут адаптированы для работы только с вашим предпочтительным подтипом ViewHolder.

Без дженериков (методы, упомянутые выше, будут иметь ViewHolder, а не общий тип VH), вы можете вернуть SubViewHolder1 из onCreateViewHolder и попытаться преобразовать первый параметр onBindViewHolder в SubViewHolder2 (и вы получите ClassCastException). Не то чтобы вы это сделали, но код позволяет вам это делать. Так почему бы не установить некоторые ограничения, которые облегчили бы вашу жизнь?

Воспользовавшись универсальным типом, вы говорите:

This is my Adapter for a RecyclerView. This Adapter deals with only this ViewHolder sub-class. Nothing else.

Другие вопросы по теме