Здесь идет речь о "разумном выборе" места обработки клика в recyclerview. 1. в ViewHolder 2. в onBindViewHolder 3. с помощью интерфейса пробросить обработку в активити.
У меня вопрос: от чего зависит выбор?
Здесь идет речь о "разумном выборе" места обработки клика в recyclerview. 1. в ViewHolder 2. в onBindViewHolder 3. с помощью интерфейса пробросить обработку в активити.
У меня вопрос: от чего зависит выбор?
По большей части, наверное, этот вопрос касается архитектурных решений. Но приведу пример: у вас есть список в адаптере (приватное поле класса), в котором хранится информация о элементах списка, которые будут отображены на экране.
Если у вас всё простенько и примитивненько, то вам не понадобится никакой сложной логики, вы просто будете устанавливать текст и прочее на элементы, и всё будет хорошо.
Но допустим, что у вас более сложная логика, вам нужно хранить в списке ещё и какую-то другую информацию, которая будет жестко привязана к элементам списка в ресайклере, но которая не будет отображаться на экране. Как пример - у вас есть новостная лента, в ней каждая запись имеет уникальный идентификатор, по которому вы можете получить более полную информацию о записи. Он не показывается на экране, а при нажатии на новость в ленте вам нужно открыть новое активити/показать другой фрагмент и т.д., на котором будет эта же запись, но более подробно описанная. И вот эти подробности нужно получить как раз по уникальному идентификатору записи. Откуда его взять? Проще всего, из того же списка в адаптере. Потому будет удобнее поместить обработку нажатий как раз в адаптер в метод onBindViewHolder.
Чтобы не пробрасывать через коллбэк обработку в активити (ведь приложение может быть сложным и большим, и тащить коллбэк через 15 классов будет глупо), можно использовать свои какие-то решения, или же готовые вроде rxjava или eventbus.
onBindViewHolderдва параметра - сам вью холдер и позиция элемента, верно? Так вот, для этого вью холдера вы сначала устанавливаете текст, картинки и прочее, в зависимости от его позиции. Вы же не устанавливаете текст в самом вью холдере? А почему? Потому что настройка его будет зависеть от его позиции в списке. Тоже самое и с обработкой нажатий. – Peter Samokhin Sep 22 '17 at 17:46onStartиonStopподписываетесь/отписываетесь от получения "обновлений", в нём же добавляете методonEventс нужной аннотацией и входными параметрами. А в адаптере вызываетеbus.post(new MyEvent("some_data"))и всё. Проще некуда. – Peter Samokhin Sep 22 '17 at 17:55