Android studio recyclerview обработка нажатий

Урок 12. Практика. UsersAdapter. Обработка клика по элементу списка

Код начала урока:

Создание SearchUsersActivity

Вначале нам надо создать новую Activity – SearchUsersActivity .

Мы ещё не создавали пакет activity . Давайте создадим его, как мы уже делали в прошлых уроках.

Давайте переместим файл UserInfoActivity в пакет activity . Для этого левой кнопкой нажимаем на UserInfoActivity и перетягиваем в пакет activity .

У вас появится диалог подтверждения перемещения файла, изменения его пакета во всех местах использования:

Нажимаем Refactor . Видим, что файл переместился. Двигаемся дальше.

Давайте в пакете activity создадим новый Java файл, который назовём SearchUsersActivity .

После этого давайте создадим layout для нашей Activity . Для этого нажмём правой кнопкой по папке layout и выберем New -> Layout resource file .

Введём имя activity_search_users , корневым элементом выберем контейнер FrameLayout . Сразу же добавим элемент RecyclerView в него:

Давайте свяжем наш layout и нашу Activity :

Также не забываем добавить нашу Activity в AndroidManifest файл:

Для тестирования давайте сделаем новую Activity SearchUsersActivity стартовой, чтобы мы могли видеть вносимые нами изменения на экране. Для этого в файле AndroidManifest перенесём блок в новую Activity :

Создание UsersAdapter

В предыдущем уроке мы познакомились с элементом RecyclerView и адаптером, при помощи которого можно отобразить элементы списка. В этом уроке предлагаем вам самостоятельно создать адаптер для списка экрана SearchUsersActivity . Наш вариант реализации приведён ниже.

Для тестирования вашего решения предлагаем создать метод getUsers() , возвращающий объекты-заглушки:

Напоминаем, что мы уже создавали файл user_item_view . Поэтому его и используем в нашем адаптере UsersAdapter .

Отличная работа. Самое время убедиться, что всё работает. Для этого добавим использование нашего адаптера в Activity . Также давайте добавим в нашу Activity методы
searchUsers() , getUsers() , чтобы отобразить в нашем списке тестовые элементы:

Запустим приложение, посмотрим на результат:

Отлично, идём дальше.

Обработка клика по элементу списка

Но на этом экране список немного отличается от предыдущего: здесь нам надо обработать нажатие на элемент списка и перейти на экран информации о пользователе.

Теперь о реализации. Механизм прост: физически на экране пользователь видит список из множества View -компонентов. Android обо всём позаботился до нас и всё, что необходимо сделать нам – это использовать готовый интерфейс-слушатель View.OnClickListener , который предоставляет единственный метод onClick(View v) . Использовать его довольно просто (помимо представленного здесь материала также можно ознакомиться с этим):

Таким образом, установив такой слушатель на View -компонент, мы можем реагировать на события нажатия на него любым необходимым нам способом. Отлично, момент, в который происходит нажатие на компонент, мы перехватываем.

Но теперь нам нужно получить данные пользователя, которые связаны, с этим компонентом. А мы, конечно же, помним, где осуществляется связь между View -компонентами и данными – в адаптере. Т.е. именно в адаптере мы можем узнать раньше всего, что произошло нажатие по какому-либо элементу и что необходимо связать его с реальными данными.

На этом зона ответственности адаптера заканчивается. За то, что делать с информацией, полученной при нажатии на элемент должна отвечать Activity . Поэтому нам необходим «мост», некий интерфейс адаптера, который бы помог нам реагировать на нажатия по элементу списка на более высоком уровне – оперируя данными.

Читайте также:  Шареман для андроида перестал работать

Помните интерфейс, который предоставляет View ? С единственным методом, который сообщает нам, какой элемент был нажат. Нам нужен такой же, только сообщать он нам будет не о нажатом View , а о нажатом пользователе:

Отлично, теперь наш адаптер предоставляет интерфейс, который должен гарантировать вызов метода onUserClick(User user) при нажатии на элемент списка. Поэтому Activity смело может использовать его для реакции на данное событие.

Т.е. мы используем обычную реализацию паттерна проектирования наблюдатель.

Создание наблюдателя за кликом в SearchUsersActivity

В данном случае нам необходимо создать внутри SearchUsersActivity наблюдателя за кликом по элементу пользователя. Наблюдатель мы реализуем, создавая новый экземпляр интерфейса OnUserClickListener . Но для начала давайте добавим этот интерфейс в наш SearchUsersAdapter , чтобы мы могли передать слушателя из Activity в Adapter :

Пока по клику на элемент будем просто выводить имя пользователя, чтобы проверить, что всё работает правильно.

Уведомление наблюдателя о событии в UsersAdapter

Теперь осталось гарантировать, что метод onUserClick(User user) будет вызываться при каждом нажатии на элемент списка. Поэтому вызывать мы его будем в методе onClick(View v) , который срабатывает именно тогда, когда нам и нужно. Отличным местом для добавления слушателя для View -компонента является место его создания в адаптере:

Метод getLayoutPosition() вернёт нам позицию, по которой произошло нажатие, что поможет нам получить по порядковому номеру элемент данных. Эти данные мы и отправляем на уровень выше в методе onUserClick(User user) , с которыми уже работает Activity .

Давайте запустим приложение, проверим что при клике на элемент отображается корректное имя:

Видим, что снизу экрана вывелся Toast с именем Elon Musk . Отлично, значит всё работает корректно.

Переход на экран UserInfoActivity

Отличная работа. Но на этом экране список немного отличается от предыдущего: здесь по нажатию на элемент списка необходимо выполнить переход на детальную информацию о пользователе. Проще говоря, по нажатию на элемент списка нам необходимо узнать id пользователя, на которого мы нажали, и использовать его для перехода на детальную информацию о нём. Делать мы это будем при помощи объекта Intent (рус. намерение), при помощи которого мы сообщаем Android системе о том, что мы изъявляем желание попасть на другой экран и передать туда некоторые данные. Подробнее об этом механизме вы можете узнать из наших видеоуроков (этом и этом), а также из официальной документации.

Также давайте создадим константу USER_ID в Activity UserInfoActivity , чтобы мы могли ссылаться на неё при получении данных на экране:

Таким образом код перехода на экран детальной информации о пользователе выглядит следующим образом:

Мы могли бы просто передать просто «сырую» строку в объекте Intent :

Однако в таком случае при получении объекта Intent следующим экраном придётся снова писать данную строку. Это повышает шанс ошибки или опечатки при написании кода. Создание же константы USER_ID просто избавляет нас от необходимости задумываться о том, что скрывается внутри неё. Android Studio просто не позволит нам ошибиться.

Полный листинг кода:

Запустим приложение. Видим, что по клику на элемент списка мы переходим на UserInfoActivity .

Таким образом, в ходе данного урока мы рассмотрели принцип работы со слушателями существующих компонентов системы, а также научились создавать свои собственные.

После того, как вы закончите тестирование, не забудьте в манифесте приложения снова сделать Activity UserInfoActivity стартовой.

Читайте также:  Ravensword shadowlands русификатор для андроид

Источник

RecyclerView onClick

кто-нибудь с помощью RecyclerView нашел способ установить onClickListener с элементами RecyclerView ? Я думал о настройке слушателя для каждого из макетов для каждого элемента, но это кажется немного слишком хлопот Я уверен, что есть способ для RecyclerView послушать onClick событие, но я не могу понять.

30 ответов

поскольку API радикально изменились, меня не удивило бы, если бы вы создали OnClickListener для каждого элемента. Хотя это не такая уж большая проблема. В реализации RecyclerView.Adapter вы должны:

на onClick способ:

вот лучший и менее тесно связанный способ реализовать OnClickListener на RecyclerView .

основываясь на ответе Джейкоба табака (+1 для него), я смог добавить слушателя onLongClick:

тогда вы можете использовать его следующим образом:

Проверьте аналогичный вопрос @CommonsWare комментарии ссылки на этой, который реализует OnClickListener интерфейс viewHolder .

вот простой пример ViewHolder :

на Adapter теперь выглядит так:

Я делаю это таким образом, без ненужных классов, детекторов и т. д. Простой код внутри нашего адаптера. Особенно лучшее решение для longClick, чем представлялось ранее.

затем внутри фрагмента или деятельности, просто нажмите:

Это то, что работал для меня. Прикрепите OnClickListener до onBindView . Я действительно не знаю, повлияет ли это на производительность, но, похоже, он отлично работает с небольшим кодом.

Это было так трудно для меня, чтобы иметь на пункт нажмите прослушиватель в деятельности, а также иметь нажмите прослушиватель для одного представления элемента, который не будет срабатывать на пункт нажмите прослушиватель. После игры с ответом Джейкоба табака я уважаю его ответ за щелчок по элементу, если никакие другие действия касания внутри элемента не представлены.

у меня есть обычай OnClickListener интерфейс, который имеет событие щелчка по элементу, которое содержит представление щелкнутого элемента и позицию элемента из адаптера. Я представляю экземпляр его в конструкторе (или он может быть с сеттером) и прикрепить его к контейнеру держателя представления нажмите прослушиватель.

у меня также есть другой прослушиватель кликов в адаптере (может быть в держателе вида), который будет обрабатывать текущий клик из контейнера.

в действии вам нужно инициализировать адаптер, передав экземпляр OnItemClickListener

и мой ViewHolder

Это то, что мне нужно, если кто-то найдет это полезным:

у меня есть хорошее решение для RecyclerView ‘ s onItemClickListener для элементов и подэлементов

Шаг 1. создать интерфейс

Шаг 2. затем используйте его в адаптере onBindViewHolder метод следующим образом

Шаг 3. найдите и настройте представление recycler в действии или фрагменте, где вы используете это

Шаг 4. наконец, реализовать интерфейс в деятельности или фрагмент где вы используете recyclerview

вот что я сделал. Это решение поддерживает onClick и onLongClick как для элементов RecyclerView, так и для внутренних элементов RecyclerView (внутренние представления).

Я таг viewHolder на вид мой выбор :

и я использую держатель.getPosition () для получения позиции в методе onClick () (onlongclick аналогичен):

вариант с getChildPosition также работает. Обратите внимание, что для внутренних представлений в onClick () используйте :

на мой взгляд, Авантаж данного решения является то, что при нажатии на изображение, только функция onclick() изображения слушателя, а когда я совместил Джейкоба решение для RecyclerView пункт вид и мое решение для внутренних соображений RecyclerView элементов функция onclick() называется также (когда нажмите на картинку).

Читайте также:  Код ошибки 103 андроид

есть гораздо более простой способ сделать это. Просто применитесь по клику в onBindViewHolder в корневом представлении.

считайте, что это ваш взгляд на адаптер,

затем выполните следующие действия в вашем адаптере

вы можете пройти clickListener to Adapter .

в своем Activity :

Тогда передайте его Adapter :

на Adapter ‘ s onCreateViewHolder :

Я разработал облегченную библиотеку для android, вы можете посетитьhttps://github.com/ChathuraHettiarachchi/RecycleClick

и следовать на следующий пример

Вы можете реализовать OnClickListener в свой класс ViewHolder

и onBindViewHolder пункта

путь слишком простой и эффективный.

вместо реализации интерфейса View.OnClickListener внутренний держатель вида или создание и интерфейс и реализация интерфейса в вашей деятельности — Я использовал этот код для simple on OnClickListener реализация.

все ответы, опубликованные до сих пор, являются отличными решениями, однако, если вы не хотите иметь дело со слишком многими деталями реализации и просто хотите, чтобы он работал аналогично тому, как ListView, я бы рекомендовал использовать TwoWay-View, как показано здесь:

обратите внимание, что эта реализация также поддерживает длительное нажатие на элементы, а также поддержку нажатых состояний (что является чем-то важным, что другие решения для этого вопрос отсутствия).

Если вы не хотите использовать всю библиотеку, взглянуть на ClickItemTouchListener класс, который при необходимости может использоваться как автономный. Единственная проблема, которую я нашел с ним на данный момент, — это длительное нажатие + прокрутка, похоже, неправильное поведение.

если вы хотите поймать событие щелчка по отдельным элементам, просто реализуйте OnClickListener на ViewHolder класс, а затем выберите набор слушателей на отдельные виды или весь itemView .

Источник

RecyclerView. Обработка клика. Intent

Есть приложение SQLite + ListView. Всё хорошо работает.
Пытаюсь переделать на SQLite + RecyclerView.
Написал адаптер.. передаю туда Cursor. Всё отображается.
Мне нужно запускать другую активити по клику на элемент списка.

Пробую так обрабатывать:

Но получаю ошибку : android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0.
Да и finish() выдает ошибку компиляции.

Если просто Toast выводить, то всё нормально.

RecyclerView анимация клика по элементу
Подскажите пожалуйста, как сделать в RecyclerView обработчик нажатий на элемент, чтобы элемент как.

Starting: Intent < act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
Выдает такую ошибку, хотя смартфон видит, он разрешает отладку, при запуске выдает такое сообщение.

Обработка кликов в RecyclerView
Доброго времени суток господа. Сделал обработку кликов по вот этому примеру .

Starting: Intent < act=android.intent.action.MAIN. и пустой белый экран
При запуске приложения всё заканчивается на Starting: Intent < act=android.intent.action.MAIN.

С «CursorIndexOutOfBoundsException» разобрался. На другую активити переходит, но совершенно хаотично.. не в соответствии с id.
Смотрю позицию тостом:
Toast.makeText(context, cursor.getPosition(), Toast.LENGTH_SHORT).show();

Как получить реальный id кликнутого item?

arzrav,
Не получилось так.

Вот тут показывают. Но там не Cursor.

Обработка прокрутки не полностью заполненного RecyclerView
Есть фрагмент с RecyclerView он используется в ViewPager. Основной фрагмент содержащий.

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

Обработка клика по ссылкам textView
Всех приветствую. Подскажите пожалуйста,как обрабатывать нажатие на ссылку в textView,чтобы при.

Advanced RecyclerView и Expandable RecyclerView
Сделал expandable recycler view на основе advancedRecyclerView сборочки, но не важно это думаю.

Обработка клика
Объясните, пожалуйста как изменить программу, чтобы ф-я module.f могла выполниться внутри head, а.

Обработка клика css
Друзья, добрый день. Задача такая — есть блок с произвольной информацией и нужно чтобы по клику.

Источник

Оцените статью