Android studio recyclerview setonscrolllistener

Русские Блоги

Исследование OnScrollListener события прокрутки RecyclerView

(1) Классификация катящихся событий

Прокрутка списка обычно делится на два типа:

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

(2) Следите за прокруткой RecyclerView

Есть два способа отслеживать события прокрутки:

Среди них setOnScrollListener устарел из-за риска использования нулевых указателей. Рекомендуется использовать addOnScrollListener.

(3)OnScrollListener

Класс OnScrollListener — это абстрактный класс с двумя методами:

3.1 метод onScrollStateChanged (RecyclerView recyclerView, int newState)

Значение двух переменных обратного вызова:
recyclerView: RecyclerView в данный момент прокручивается
newState: текущее состояние прокрутки.

Среди них newState имеет три значения:

3.2 метод onScrolled (RecyclerView recyclerView, int dx, int dy)

Значение трех переменных обратного вызова:
recyclerView: текущий вид с прокруткой
dx: расстояние горизонтальной прокрутки
dy: расстояние вертикальной прокрутки

dx > 0 Когда палец прокручивается влево,Список прокручивается, чтобы отобразить содержимое справа
dx 0 Когда палец прокручивается вверх,Список прокручивается, чтобы отобразить следующее содержимое
dy = общее количество элементов
Таким образом, можно судить, что он находится внизу.

к
visibleItemCount + pastVisiblesItems) >= totalItemCount
, чтобы определить, является ли это дном.

Источник

Обнаружение начала и конца прокрутки в recyclerview

Мне нужно определить начало / конец и направление прокрутки в recyclerview. У прослушивателя прокрутки есть два метода: onScrolled() и onScrollStateChanged() . Первый метод вызывается после запуска прокрутки (действительно, вызывается onScrolled (), а не onScrolling ()). Второй метод дает информацию о состоянии, но у меня нет информации о направлении. Как я могу достичь своей цели?

7 ответов

Шаг 1 Вы можете создать класс, расширяющий RecyclerView.OnScrollListener, и переопределить эти методы

Шаг 2- Поскольку setOnScrollListener устарел, лучше использовать addOnScrollListener

Вот полное решение для выполнения действия после остановки прокрутки (для RecyclerView)

Который исправил мое исключение OutOfBounds, связанное с прокруткой recyclerView

Думаю, другие ответы не касаются вашей болевой точки.

О вопросе

Как вы сказали, RecycleView вызовет onScrollStateChanged () перед методом onScrolled (). Однако метод onScrollStateChanged () может сообщить вам только три состояния RecycleView:

  • SCROLL_STATE_IDLE
  • SCROLL_STATE_DRAGGING
  • SCROLL_STATE_SETTLING
Читайте также:  Прошить выключенный андроид через один

Это означает, что предположим, что RecycleView сейчас находится наверху, если пользователь прокручивает страницу вверх, он может запускать только метод onScrollStateChanged() , но не метод onScrolled() . И если пользователь прокручивает страницу вниз, сначала запускается метод onScrollStateChanged() , а затем метод onScrolled() .

Затем возникает проблема: SCROLL_STATE_DRAGGING может только сказать вам, что пользователь перетаскивает представление, но не может сказать направление его перетаскивания.

Вы должны объединить с методом dy from onScrolled() для определения направления перетаскивания, но onScrolled() не запускается с onScrollStateChanged() .

MySolution:

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

Источник

Реализация списка с заголовком, футером и пагинацией в Андроид

RecyclerView

RecyclerView — это расширенная версия ListView с некоторыми улучшениями в производительности и с новыми функциями. Как следует из названия, RecyclerView перерабатывает или повторно использует представления элементов при прокрутке. В RecyclerView гораздо проще добавлять анимации по сравнению с ListView. В этом уроке мы разберем, как создать RecyclerView с заголовком, футером, разбиением на страницы и анимацией.

Настройка Gradle

Добавьте следующую зависимость в файл build.gradle:

Добавление RecyclerView в XML представление

После того, как проект будет синхронизирован, добавьте компонент RecyclerView в ваш макет:

Привязка XML с классом JAVA

Теперь в методе onCreate вашей активности добавьте следующий код:

Прежде чем идти дальше, давайте подробно рассмотрим приведенный выше код

  • Layout Manager — Простыми словами, Layout Manager помогает нам определить структуру нашего RecyclerView. Есть три встроенных Layout Managers. Помимо этого, мы можем создать собственный пользовательский Layout Manager, чтобы удовлетворить наши требования.

  1. LinearLayoutManager показывает элементы в списке с вертикальной или горизонтальной прокруткой.
  2. GridLayoutManager показывает элементы в сетке.
  3. StaggeredGridLayoutManager показывает элементы в шахматной сетке.

RecyclerView ItemDecoration

ItemDecoration позволяет приложению добавлять специальный полосы и смещения к определенным представлениям элементов из набора данных адаптера. Это может быть полезно для рисования разделителей между элементами, выделениями, границами визуальной группировки и т. д. – developer.android.com

В этом примере мы будем использовать ItemDecoration для добавления отступов к каждому элементу.

В вышеприведенном классе мы устанавливаем отступы к нулевому элементу.

RecyclerView Adapter

Теперь давайте настроим адаптер ReeyclerView с заголовком и футером.

Пагинация

Теперь, когда адаптер готов, давайте посмотрим, как добавить пагинацию в список RecyclerView. Это довольно легко сделать и должно быть добавлено в onCreate после установки Adapter to Recycler-View.

Всякий раз, когда данные изменяются в mList, вызывайте функцию ниже, чтобы обновить адаптер RecyclerView и показать новые данные.

Читайте также:  Tcl android tv updates telegram

Надеюсь, что этот пост поможет вам получить общее представление о настройке RecyclerView с заголовком, подвалом и пагинацией.

Источник

Прокрутите RecyclerView, чтобы показать выбранный элемент сверху

Я ищу способ прокрутки RecyclerView чтобы показать выбранный элемент сверху.

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

проблема в том, что RecyclerView возвращает ошибку при использовании это scrollTo способ сказать

RecyclerView не поддерживает прокрутку до абсолютной позиции

как может Я прокручиваю RecyclerView чтобы поместить выбранный элемент в верхнюю часть представления?

12 ответов

Если вы используете LinearLayoutManager или StaggeredGridLayoutManager, у каждого из них есть scrollToPositionWithOffset метод, который принимает как положение, так и смещение начала элемента с начала RecyclerView, который, похоже, выполнит то, что вам нужно (установка смещения на 0 должна совпадать с верхней).

Если вы ищете вертикальный LinearLayout Manager, вы можете добиться плавной прокрутки с помощью пользовательского LinearSmoothScroller :

используйте экземпляр layoutmanager в представлении recycle, а затем вызовите recyclerView.smoothScrollToPosition(pos); сгладит прокрутку до выбранной позиции в верхней части представления recycler

/ / прокрутить пункт pos

вам просто нужно позвонить recyclerview.scrollToPosition(position) . Это прекрасно!

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

Я надеюсь, это может помочь вам.

то же самое с регулятор скорости

попробуйте то, что сработало для меня круто!

создать переменную private static int displayedposition = 0;

Теперь для позиции вашего RecyclerView в вашей деятельности.

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

Ну вот и все, это сработало отлично для меня \o/

что я сделал, чтобы восстановить положение прокрутки после обновления RecyclerView на кнопку нажал:

получение смещения первого видимого элемента сверху перед созданием объекта linearLayoutManager и после его создания вызывался объект scrollToPositionWithOffset объекта LinearLayoutManager.

прокрутка в определенной позиции
и это мне очень помогло. с помощью click listener вы можете получить позицию в вашем адаптере

В моем случае мой RecyclerView есть отступ сверху такой

затем для прокрутки элемента вверх, мне нужно

Источник

RecyclerView горизонтальная прокрутка в центре

Я пытаюсь сделать вид с карусели здесь, используя RecyclerView, я хочу, чтобы элемент защелкнул середину экрана при прокрутке, по одному элементу за раз. Я пробовал использовать recyclerView.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_PAGING);

Но «просмотр по-прежнему прокручивается гладко, я также пытался реализовать свою собственную логику, используя прослушиватель прокрутки:

Читайте также:  Radiohead paranoid android live

Теперь салфетка справа налево работает нормально, но не наоборот, что мне здесь не хватает?

С LinearSnapHelper это сейчас очень просто.

Все, что вам нужно сделать, это:

Обновить

Доступный с 25.1.0, PagerSnapHelper может помочь достичь эффекта ViewPager . Используйте его так же, как вы бы использовали LinearSnapHelper .

Старое обходное решение:

Если вы хотите, чтобы он был похож на ViewPager , попробуйте это вместо этого:

Выполнение выше просто возвращает позицию рядом с текущим элементом (в центре) в зависимости от направления скорости, независимо от величины.

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

Важное обновление:

Google реализовал это в Android Support Library 24.2.0 (выпущен в августе 2016 года). В примечаниях к выпуску говорится следующее:

RecyclerView.OnFlingListener добавлен для поддержки пользовательского поведения в ответ на flings. Класс SnapHelper обеспечивает реализацию специально для привязки дочерних представлений, а класс LinearSnapHelper расширяет эту реализацию, чтобы обеспечить выравнивание по центру, похожее на ViewPager .

Заметьте, что я еще не пытался использовать LinearSnapHelper . Я все еще использую свое решение, которое отлично работает.

Оригинальный ответ:

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

Решение основано на решении @eDizzle, которое, по моему мнению, я улучшило, чтобы сказать, что оно работает почти как ViewPager .

Вот как это выглядит:

Важно: ширина элемента RecyclerView точно такая же, как на экране. Я не пробовал с другими размерами. Также я использую его с горизонтальным LinearLayoutManager . Я думаю, что вам нужно будет адаптировать код, если вы хотите вертикальную прокрутку.

Здесь у вас есть код:

Вы должны использовать findFirstVisibleItemPosition для перехода в противоположном направлении. И для определения того, в каком направлении находился салфетка, вам нужно получить либо скорость движения, либо изменение x. Я подошел к этой проблеме немного под другим углом, чем у вас.

Создайте новый класс, который расширяет класс RecyclerView, а затем переопределяет метод Fling RecyclerView следующим образом:

Если цель состоит в том, чтобы заставить RecyclerView имитировать поведение ViewPager существует довольно простой подход

Используя PagerSnapHelper вы можете получить такое поведение, как ViewPager

Я передаю этот менеджер компоновки в RecycledView и устанавливаю смещение, необходимое для элементов центра. Все мои предметы имеют одинаковую ширину, поэтому постоянное смещение в порядке

Источник

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