Комментарии 8
очепятка в «Где и как?»
в списке два раза упомянут «onViewAttachedToWindow» вместо видимо «onViewDetachedFromWindow»
По вопросу размещения слушателей: в качестве довода «соображения симметрии» не кажутся мне убедительными, ведь располагая их «на экваторе» процессов, а именно, в методе
onBindViewHolder()
с применением флагов и их анализа, мы ничего не теряем, кроме умозрительной симметрии.Спасибо!
Кроме симметрии, есть 3 причины не использовать флаги:
- Введение флагов – дополнительный код. Дополнительный код – усложнение решения.
- Вы привязываете слушателя, т.е. навешиваете логику взаимодействия с элементом на основании того, что элемент был или не был отправлен в кэш (оптимизация производительности) – это разные абстракции, и их не стоить смешивать.
onRecycledView
теоретически может вообще не быть вызван. Сходу мне не удалось воспроизвести такую ситуацию, но в исходом коде есть такая функция:
void addViewHolderToRecycledViewPool(@NonNull RecyclerView.ViewHolder holder, boolean dispatchRecycled)
Если ее вызвать с параметром dispatchRecycled = false
, то элемент отправится в пул, но уведомления об этом не будет.
2 и 3 пункты, на мой взгляд, еще и отвечают на вопрос, почему в документации не расписан порядок вызова этих методов – onRecycledView
не надо использовать для чего-то, кроме потенциальной очистки своего кэша.
С RecyclerView.OnItemTouchListener
получается больше возни. Он не дает прямого доступа к самому элементу (или к его позиции), который был нажат, надо подключать GestureDetector
. Он все-таки предназначен для обработки более сложных жестов. Для простых случаев быстрее и проще навесить OnClickListener
на сам элемент. Плюс, в зависимости от типа элемента, реакция на нажатие может быть разная, и выносить эту логику наверх, дальше от самого элемента, может быть неудобно.
По большому счету, зависит от того, надо ли вам убирать этот listener.
Если вы просто устанавливаете OnClickListener, в котором дергаете какой-нибудь метод из активити, то я не вижу ничего плохо в привязывании в onCreateViewHolder
.
Если же вы подписываетесь на какое-то внешнее событие (например, реагируете на какое-то событие от активити), то от него надо будет где-то отписываться. Если подписка была произведена в onCreateViewHolder
, то где от нее отписываться?
О чем все-таки говорит developer.android.com про RecyclerView