Кто-нибудь с помощью RecyclerView
нашел способ установить onClickListener
элементы в RecyclerView
? Я думал о том, чтобы настроить слушателя для каждого макета для каждого элемента, но это кажется слишком сложным, я уверен, что есть способ RecyclerView
прослушать onClick
событие, но я не могу понять это.
583
Ответы:
Поскольку API радикально изменились, меня не удивит, если вы создадите
OnClickListener
для каждого элемента. Это не так много хлопот, хотя. В вашей реализацииRecyclerView.Adapter<MyViewHolder>
вы должны иметь:onClick
Метод:источник
onClick()
принадлежностьOnClickListener
может быть прикреплена к ЛЮБОМУ Виду. Весь вопрос здесь в том, какие! Пожалуйста, приложите усилие, метод идентифицируется не только по имени, но и по крайней мере по классу. Если вы не говорите, что ваш код должен быть добавлен в адаптер, ваш ответ на самом деле не поможет.Вот лучше и менее тесно связаны способом реализовать
OnClickListener
дляRecyclerView
.Фрагмент использования:
RecyclerItemClickListener
реализация:источник
Я делаю это таким образом, без лишних классов, детекторов и т. Д. Простой код внутри нашего адаптера. Особенно лучшее решение для longClick, чем представленное ранее.
Затем внутри фрагмента или действия просто нажмите:
источник
Посмотрите похожий вопрос @ CommonsWare в комментариях к этому , который реализует
OnClickListener
интерфейс вviewHolder
.Вот простой пример
ViewHolder
:Adapter
Тогда выглядит следующим образом :источник
ListView
уже было проблематично, если вам нужно было создать список более сложных объектов, чем простые строки. Что делать, если вам нужно обрабатывать различные события в зависимости от того, где вы щелкаете элемент в ListView? Ты пьян. Здесь у вас есть каждый слушатель.getPosition()
устарела, используйтеgetAdapterPosition()
илиgetLayoutPosition()
вместо.Основываясь на ответе Джейкоба Табака (+1 для него), я смог добавить слушателя onLongClick:
Тогда вы можете использовать это так:
источник
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
view.getId() == R.id.selection
Это то, что сработало для меня. Прикрепить
OnClickListener
кonBindView
. На самом деле я не знаю, повлияет ли это на производительность, но, похоже, с небольшим кодом все работает нормально.источник
Мне было так трудно иметь прослушиватель щелчков по элементам в упражнении, а также иметь прослушиватель щелчков для одного представления элемента, которое не будет вызывать прослушиватель щелчков по элементам. После игры с ответом Джейкоба Табака, я уважаю его ответ на щелчок предмета, если внутри предмета не представлено никаких других действий касания.
У меня есть обычай
OnClickListener
интерфейс, который имеет событие щелчка элемента, которое содержит вид элемента, по которому щелкнули, и позицию элемента из адаптера. Я представляю экземпляр этого в конструкторе (или это может быть с сеттером) и присоединяю его к слушателю щелчка контейнера держателя представления.У меня также есть другой прослушиватель щелчков в адаптере (может быть в держателе вида), который будет обрабатывать текущий щелчок вида из контейнера.
В упражнении необходимо инициализировать адаптер, передав экземпляр
OnItemClickListener
И мой ViewHolder
источник
Это то, что мне в конечном итоге нужно, на случай, если кто-то найдет это полезным:
Источник: http://blog.csdn.net/jwzhangjie/article/details/36868515
источник
У меня есть хорошее решение для
RecyclerView
сonItemClickListener
для предметов и подразделовШаг 1 - Создайте интерфейс
Шаг 2 - Затем используйте его в
onBindViewHolder
методе адаптера следующим образомШаг 3 - найдите и настройте представление рециркулятора в действии или фрагменте, где вы используете это
Шаг 4 - Наконец, внедрите интерфейс в упражнении или фрагменте, где вы используете просмотрщик
источник
Вот что я сделал. Это решение поддерживает как onClick, так и onLongClick для элементов RecyclerView и представлений внутри элементов RecyclerView (внутренние представления).
Я отмечаю viewHolder на представлениях по моему выбору:
И я использую holder.getPosition () для получения позиции в методе onClick () (onLongClick аналогично):
Вариант с getChildPosition также работает. Обратите внимание, что для внутренних представлений в onClick () используйте:
На мой взгляд, преимущество этого решения заключается в том, что при нажатии на изображение вызывается только прослушиватель изображения onclick (), тогда как при объединении решения Jacob для представления элемента RecyclerView и моего решения для внутренних представлений представление RecyclerView Item onclick ( ) также называется (при нажатии на изображение).
источник
Существует гораздо более простой способ сделать это. Просто подать заявку на клик в
onBindViewHolder
корневом представлении.Считайте, что это ваш взгляд на адаптер,
Затем выполните следующее в вашем адаптере
источник
Вы можете передать
clickListener
вAdapter
.В вашем
Activity
:затем передайте его
Adapter
:В
Adapter
хonCreateViewHolder
:источник
holder
значения через намерение?Я разработал легкую библиотеку для Android, вы можете посетить https://github.com/ChathuraHettiarachchi/RecycleClick
и следовать для следующего образца
источник
Вы можете реализовать OnClickListener для вашего класса ViewHolder
И onBindViewHolder установить элемент вашего держателя представления
источник
Слишком просто и эффективно.
Вместо того, чтобы реализовывать интерфейс
View.OnClickListener
внутри держателя вида или создавать и взаимодействовать и реализовывать интерфейс в вашей деятельности - я использовал этот код для простойOnClickListener
реализации.источник
Все ответы, опубликованные до сих пор, являются отличными решениями, однако, если вы не хотите иметь дело со слишком большим количеством деталей реализации и просто хотите, чтобы он работал аналогично ListView, я бы рекомендовал использовать TwoWay-View, как показано здесь:
https://github.com/lucasr/twoway-view
Обратите внимание, что эта реализация также поддерживает длительное нажатие на элементы, а также поддержку нажатых состояний (что является важным, чего нет в других решениях этого вопроса).
Если вы не хотите использовать всю библиотеку, взгляните на класс ClickItemTouchListener , который при необходимости можно использовать как автономный. Единственная проблема, с которой я столкнулся на данный момент - это долгое нажатие + прокрутка, похоже, некорректное поведение.
источник
Если вы хотите отловить событие click «По отдельным элементам», просто внедрите его
OnClickListener
вViewHolder
класс, а затем установите прослушиватели «click» для отдельных представлений или целыхitemView
.Следующий пример показывает то же самое
источник
Для меня это лучший способ:
источник
Он
RecyclerView
не имеетOnClickListener
и должен будет реализовать это самостоятельно.Мне нравится добавлять
OnItemClickListener
интерфейсAdapter
сonClick
методом, который вызывается, когда вы щелкаете по представлению элемента изViewHolder
. Таким образом, ответственность за управление нажмите на элемент находится внеViewHolder
иAdapter
. Будет ли действие или фрагмент, который будет решать, что делатьДобавьте интерфейс к слушателю и объекту слушателя.
Мы фиксируем щелчок по корневому представлению элемента и при обратном
onClick
вызове запускается прослушиватель вызова на адаптере.Поскольку в нашем случае активность или фрагмент, фрагмент в нашем случае, мы назначаем слушателю для адаптера, а при обратном вызове onClick мы получим выбранный элемент по позиции и открыли подробную активность элемента.
источник
К сожалению
RecyclerView
, отсутствует пара функций, которыеListView
были встроены. Например, возможность добавить,OnItemClickListener
что срабатывает при нажатии элемента.RecyclerView
позволяет вам установитьOnClickListener
в вашем адаптере, но передача прослушивателя щелчков от вашего вызывающего кода к адаптеру и кViewHolder
, сложна для перехвата простого щелчка элемента.Вы также должны определить,
R.id.item_click_support
используя ids.xml:Получившийся прослушиватель щелчка кода теперь выглядит так:
Для краткого объяснения о кликах в обзоре переработчика, пожалуйста, посмотрите этот littlerobots_blog
источник
Вы можете легко определить setOnClickListener в вашем классе ViewHolder следующим образом:
источник
Вот что я сделал Подробнее и скачать суть здесь
Добавление того же здесь
CustomItemClickListener.java
ItemsListAdapter.java
источник
Судя по большинству приведенных выше ответов, они, похоже, устанавливают свои клик-слистеры на отдельные элементы. Тем не менее, решение, которое я собираюсь предложить, очень простое, но не интуитивное для многих. Многие забывают, что другие компоненты всегда находятся в родительском компоненте, который используется для отображения элементов в представлениях List или Recycler. Это решение заключается только в том, чтобы настроить одного слушателя onclick для этого родительского представления, и ход проигрывается. Решение также включает в себя способ передать положение элемента, по которому щелкают, из списка или представления переработчика. Здесь наш основной rootview - это CardView из библиотеки поддержки Android. Вот пример кода
источник
Kotlin реализация ответа nhaarman :
RecyclerItemClickListener.java:
источник
источник
источник
Мы можем сделать это, используя слабые ссылки Java. Семантически держатель представления - это тот, кто должен ответить на событие щелчка или делегировать его правильному респонденту.
Наши цели:
шаги:
Создайте интерфейс для обработки ответов кликов.
Реализуйте этот интерфейс в Activity, которая будет обрабатывать щелчок.
Добавьте переменную-член в адаптере RecyclerView для хранения слабой ссылки и конструктора, который ее устанавливает.
Сделайте то же самое в RecyclerView ViewHolder и добавьте переменную-член, чтобы отслеживать положение.
Установите слушателей по щелчку на любом представлении, которое вы хотите в ViewHolder, а затем перезвоните респонденту, чтобы обработать их.
Измените метод onBindViewHolder, чтобы установить позицию при связывании.
Передайте ответчик вниз ViewHolder.
Теперь в респонденте вы можете использовать getId () в представлении, чтобы выяснить, какое представление было нажато.
А вот Gist, чтобы вы могли увидеть, как все это сочетается: RecyclerView обработка кликов
источник
Я знаю, что есть много ответов, но я подумал, что я мог бы просто предоставить свою реализацию этого также. (Более подробную информацию можно найти на другой вопрос, на который я ответил ).
Итак, чтобы добавить прослушиватель кликов, ваш внутренний
ViewHolder
класс должен быть реализованView.OnClickListener
. Это потому , что вы подадитеOnClickListener
кitemView
параметруViewHolder
конструктора «S. Позвольте мне показать вам, что я имею в виду:Единственное, что вам нужно добавить, это пользовательский интерфейс для вашего
Adapter
метода и метода установки:Итак, ваша новая поддержка кликов
Adapter
завершена.Теперь давайте использовать это ...
Это в основном, как вы бы создали нормальный
Adapter
, за исключением того, что вы используете созданный вами метод установки, чтобы контролировать, что вы будете делать, когда ваш пользователь щелкает конкретный элемент списка.Вы также можете просмотреть ряд примеров, которые я сделал для этого Gist на GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
источник
Это то, что я делаю, чтобы использовать повторно
OnClickListener
в ViewHoder Возьмите родителя itemlayout
в onBindViewHolder установить тег в качестве позиции
и в онклике
источник
Для меня чистый способ сделать это - вот этот.
Конструктор адаптера
Связанный интерфейс
источник