Как отключить прокрутку RecyclerView?
Я не могу отключить прокрутку в RecyclerView . Я попытался позвонить rv.setEnabled(false) , но все еще могу прокручивать.
Как отключить прокрутку?
30 ответов
Для этого вам следует переопределить layoutmanager вашего recycleview. Таким образом будет отключена только прокрутка, ни одна из других функций. Вы по-прежнему сможете обрабатывать щелчки или любые другие события касания. Например:-
Оригинал:
Здесь, используя флаг «isScrollEnabled», вы можете временно включить / отключить функцию прокрутки вашего повторного просмотра.
Также:
Просто переопределите существующую реализацию, чтобы отключить прокрутку и разрешить щелчок.
Я знаю, что у этого уже есть принятый ответ, но решение не учитывает случай использования, с которым я столкнулся.
Мне особенно нужен элемент заголовка, который по-прежнему можно было щелкнуть, но отключил механизм прокрутки RecyclerView. Это можно сделать с помощью следующего кода:
в XML: —
В XML-файле дочернего макета RecyclerView
в Java: —
В ваш RecyclerView в Java-коде.
Использование ViewCompat (Java): —
childRecyclerView.setNestedScrollingEnabled(false); будет работать только на устройствах android_version> 21 . для работы на всех устройствах используйте следующие
Расширьте LayoutManager и переопределите canScrollHorizontally() и canScrollVertically() , чтобы отключить прокрутку.
Имейте в виду, что вставка элементов в начало не приведет к автоматической прокрутке назад к началу, чтобы обойти это, сделайте что-то вроде:
В Kotlin, если вы не хотите создавать дополнительный класс только для установки одного значения, вы можете создать анонимный класс из LayoutManager:
Другой альтернативой является setLayoutFrozen , но она имеет ряд других побочных эффектов.
Написал котлинскую версию:
Есть действительно простой ответ.
Приведенный выше код отключает вертикальную прокрутку RecyclerView.
Поскольку setLayoutFrozen устарел, вы можете отключить прокрутку, заморозив RecyclerView с помощью suppressLayout .
Если вы просто отключите только функцию прокрутки для RecyclerView , вы можете использовать метод setLayoutFrozen(true); для RecyclerView . Но отключить сенсорное событие нельзя.
Создайте класс, расширяющий класс RecyclerView .
Это отключит событие прокрутки, но не события щелчка.
Используйте это в своем XML, сделайте следующее:
Вы можете отключить прокрутку, заморозив RecyclerView.
Чтобы заморозить: recyclerView.setLayoutFrozen(true)
Чтобы разморозить: recyclerView.setLayoutFrozen(false)
Это работает для меня:
Это немного хакерский обходной путь, но он работает; вы можете включить / отключить прокрутку в RecyclerView .
Это пустой RecyclerView.OnItemTouchListener , захватывающий каждое событие касания, что приводит к отключению цели RecyclerView .
НАСТОЯЩИЙ РЕАЛЬНЫЙ ответ: Для API 21 и выше:
Код Java не требуется. Вы можете установить android:nestedScrollingEnabled=»false» в xml:
Дополнительная информация в документации
Чтобы остановить прокрутку прикосновением, но продолжайте прокрутку с помощью команд:
Для тех, кто хочет просто запретить пользователю прокручивать RecyclerView, не теряя smoothScrollToPosition или любой другой метод «перехода в позицию», я бы рекомендовал расширить класс RecyclerView , переопределив onTouchEvent . Как это:
Вам нужно просто добавить эту строку:
Существует более простой способ отключить прокрутку (технически это скорее перехват события прокрутки и его завершение при выполнении условия) с использованием стандартных функций. RecyclerView имеет метод под названием addOnScrollListener(OnScrollListener listener) , и с его помощью вы можете остановить его прокрутку, вот так:
Пример использования: Предположим, вы хотите отключить прокрутку при нажатии на один из элементов внутри RecyclerView , чтобы вы могли выполнять с ним некоторые действия, не отвлекаясь на случайную прокрутку к другому элементу, а когда вы закончите с ним, просто щелкните элемент еще раз, чтобы включить прокрутку. Для этого вам нужно прикрепить OnClickListener к каждому элементу в RecyclerView , чтобы при нажатии на элемент он переключал isItemSelected с false на <
Примечание: для удобства использования попробуйте использовать GestureListener вместо OnClickListener , чтобы предотвратить accidental кликов.
Наткнулся на фрагмент, содержащий несколько RecycleView, поэтому мне нужна только одна полоса прокрутки вместо одной полосы прокрутки в каждом RecycleView.
Поэтому я просто помещаю ScrollView в родительский контейнер, содержащий 2 RecycleView, и использую android:isScrollContainer=»false» в RecycleView.
Вот как я сделал это с привязкой данных:
Вместо «истины» я использовал логическую переменную, которая изменялась в зависимости от условия, чтобы представление ресайклера переключалось между отключенным и включенным.
В методе действия onCreate вы можете просто сделать:
И он перестает прокручиваться.
В вашем дочернем элементе SrollView или NestedScrollView (и родительском элементе ListView, recyclerview и gridview любого)
Просто добавьте это в свою корзину в xml
Я боролся с этой проблемой в течение некоторого часа, поэтому я хотел бы поделиться своим опытом. Для решения layoutManager это нормально, но если вы хотите повторно включить прокрутку, ресайклер вернется наверх.
Лучшее решение на данный момент (по крайней мере для меня) — использовать метод @Zsolt Safrany, но добавить геттер и сеттер, поэтому вам не нужно удалять или добавлять OnItemTouchListener.
Вы можете добавить эту строку после настройки вашего адаптера
Теперь ваш recyclerview будет работать с плавной прокруткой
Переопределите onTouchEvent () и onInterceptTouchEvent () и верните false, если вам вообще не нужен OnItemTouchListener. Это не отключает OnClickListeners для ViewHolders.
По какой-то причине ответ @Alejandro Gracia начинает работать только через несколько секунд. Я нашел решение, которое мгновенно блокирует RecyclerView:
Источник
Как отключить прокрутку RecyclerView?
Я не могу отключить прокрутку в RecyclerView . Я попытался вызвать rv.setEnabled(false) но я все еще могу прокручивать.
Как отключить прокрутку?
Для этого вы должны переопределить layoutmanager вашего recycleview. Таким образом, он будет отключать прокрутку, ни одну из других функций. Вы по-прежнему сможете обрабатывать клики или любые другие события касания. Например:-
Оригинал:
Здесь, используя флаг isScrollEnabled, вы можете временно включать / отключать функции прокрутки вашего временного цикла.
Также:
Просто переопределите существующую реализацию, чтобы отключить прокрутку и разрешить щелчок.
Дополнительная информация в документации
Это немного хакерское решение, но оно работает; Вы можете включить / отключить прокрутку в RecyclerView .
Это пустой RecyclerView.OnItemTouchListener крадущий каждое событие касания, таким образом отключая целевой RecyclerView .
Это работает для меня:
Расширьте LayoutManager и переопределите canScrollHorizontally() и canScrollVertically() чтобы отключить прокрутку.
Имейте в виду, что вставка элементов в начале не будет автоматически прокручиваться назад до начала, чтобы обойти это:
Другой альтернативой является setLayoutFrozen , но он поставляется с рядом других побочных эффектов.
Я знаю, что у этого уже есть принятый ответ, но решение не учитывает прецедент, с которым я столкнулся.
Мне определенно нужен элемент заголовка, который по-прежнему доступен для кликов, но отключил механизм прокрутки RecyclerView. Это может быть выполнено с помощью следующего кода:
Вы также можете установить android:nestedScrollingEnabled=»false» в xml:
Почему-то ответ @Alejandro Gracia начинает работать только через несколько секунд. Я нашел решение, которое мгновенно блокирует RecyclerView:
Создать класс, который расширяет класс RecyclerView
Это отключит событие прокрутки, но не события кликов
Используйте это в своем XML, чтобы сделать следующее:
Переопределите onTouchEvent () и onInterceptTouchEvent () и верните false, если вам вообще не нужен OnItemTouchListener. Это не отключает OnClickListeners ViewHolders.
Я боролся в этой проблеме в течение некоторого часа. Поэтому я хотел бы поделиться своим опытом. Для решения layoutManager это нормально, но если вы хотите повторно использовать прокрутку, то переработчик вернется к началу.
Лучшее решение пока (для меня, по крайней мере) использует метод @Zsolt Safrany, но добавляет getter и setter, поэтому вам не нужно удалять или добавлять OnItemTouchListener.
Вот как я это сделал с привязкой данных:
Вместо «true» я использовал логическую переменную, которая была изменена в зависимости от состояния, так что просмотр recycler переключился бы между отключением и включением.
Источник
Как отключить прокрутку RecyclerView?
Я не могу отключить прокрутку в RecyclerView . Я пытался дозвониться rv.setEnabled(false) но я все еще можете прокручивать.
Как отключить прокрутку?
21 ответов
вы должны переопределить layoutmanager вашего recycleview для этого. Таким образом, он отключит только прокрутку, ни одну из других функций. Вы по-прежнему сможете обрабатывать щелчок или любые другие события касания. Например:-
Оригинал:
здесь, используя флаг «isScrollEnabled», вы можете временно включить/отключить функцию прокрутки вашего recycle-view.
также:
простое переопределение существующей реализации отключить прокрутку и разрешить щелчок.
Это немного хакерский обходной путь, но он работает; вы можете включить/отключить прокрутку в RecyclerView .
это пустой RecyclerView.OnItemTouchListener кража каждого события касания, таким образом, отключив цель RecyclerView .
это работает для меня:
для API 21 и выше:
не требуется код java. Вы можете установить android:nestedScrollingEnabled=»false» в xml:
создать класс, который расширит RecyclerView класс
это отключит событие прокрутки, но не события щелчка
используйте это в своем XML сделайте следующее:
расширения LayoutManager и заменить canScrollHorizontally() и canScrollVertically() отключить прокрутку.
имейте в виду, что вставка элементов в начале не будет автоматически прокручиваться назад к началу, чтобы обойти это сделать что-то вроде:
Другой альтернативой является setLayoutFrozen , но он поставляется с кучей других побочных эффектов.
Я знаю, что это уже есть принятый ответ, но решение не учитывать случай с которым я столкнулся.
мне особенно нужен элемент заголовка, который все еще был доступен для клика, но отключил механизм прокрутки RecyclerView. Это можно сделать с помощью следующего кода:
по какой-то причине @Alejandro Gracia ответ начинает работать только через несколько секунд. Я нашел решение, которое мгновенно блокирует RecyclerView:
переопределите onTouchEvent () и onInterceptTouchEvent () и верните false, если вам вообще не нужен OnItemTouchListener. Это не отключает OnClickListeners из ViewHolders.
в XML :-
вы можете добавить
в дочернем XML-файле макета RecyclerView
в Java :-
к вашему RecyclerView в коде Java.
Использование ViewCompat (Java): —
childRecyclerView.setNestedScrollingEnabled(false); будет работать только в android_version>21 устройства. для работы во всех устройствах использовать после
если вы просто отключите только функциональность прокрутки of RecyclerView затем вы можете использовать setLayoutFrozen(true); метод RecyclerView . Но это не может быть отключить событие touch.
я боролся в этом вопросе в течение некоторого часа, Поэтому я хотел бы поделиться своим опытом, Для решения layoutManager это нормально, но если вы хотите восстановить прокрутку, recycler вернется наверх.
лучшее решение до сих пор (для меня, по крайней мере) использует @Zsolt Safrany methode, но добавляет геттер и сеттер, поэтому вам не нужно удалять или добавлять OnItemTouchListener.
написал версию Котлин:
вот как я это сделал с привязкой данных:
вместо «true» я использовал логическую переменную, которая изменилась на основе условия, чтобы представление recycler переключалось между отключенным и включенным.
столкнулся с фрагментом, который содержит несколько RecycleView, поэтому мне нужна только одна полоса прокрутки вместо одной полосы прокрутки в каждом RecycleView.
поэтому я просто помещаю ScrollView в родительский контейнер, содержащий 2 RecycleViews и использую android:isScrollContainer=»false» в RecycleView
просто добавьте это в свой recycleview в xml
в вашем ребенке SrollView или NestedScrollView (и родителе ListView, recyclerview и gridview любого)
существует более простой способ отключить прокрутку, используя только стандартные функции. RecyclerView имеет метод, называемый addOnScrollListener(OnScrollListener listener) , и используя только это, вы можете остановить прокрутку, просто так:
использовать случае: Предположим, вы хотите отключить прокрутку при нажатии на один из элементов в RecyclerView таким образом, вы можете выполнять некоторые действия с ним, не отвлекаясь на случайную прокрутку до другого элемента, и когда вы закончите с это, просто нажмите на элемент еще раз, чтобы включить прокрутку. Для этого вы хотели бы прикрепить OnClickListener для каждого элемента в RecyclerView , поэтому, когда вы нажимаете на элемент, он будет переключаться isItemSelected С false to true . Таким образом, когда вы пытаетесь прокрутить, RecyclerView автоматически вызывает метод onScrollStateChanged и с isItemSelected значение true , оно остановит немедленно, перед RecyclerView есть шанс, хорошо. прокрутить.
Примечание: Для лучшего удобства использования попробуйте использовать GestureListener вместо OnClickListener в запретить accidental кликов.
Источник
Как отключить прокрутку RecyclerView?
Я не могу отключить прокрутку в RecyclerView . Я попытался позвонить, rv.setEnabled(false) но все еще могу прокрутить.
Как я могу отключить прокрутку?
Для этого вам следует переопределить макет менеджера вашего повторного просмотра. Таким образом, он только отключит прокрутку, ни одну из других функций. Вы по-прежнему сможете обрабатывать щелчки или любые другие события касания. Например:-
Оригинал:
Здесь с помощью флага «isScrollEnabled» вы можете временно включить / отключить функцию прокрутки вашего повторного просмотра.
Также:
Просто переопределите существующую реализацию, чтобы отключить прокрутку и разрешить щелчок.
Больше информации в документации
РЕАЛЬНО РЕАЛЬНО ответ: для API 21 и выше:
Код Java не требуется. Вы можете установить android:nestedScrollingEnabled=»false» в xml:
Это немного хакерский обходной путь, но он работает; Вы можете включить / отключить прокрутку в RecyclerView .
Это пустое RecyclerView.OnItemTouchListener воровство каждого сенсорного события, таким образом отключая цель RecyclerView .
Это работает для меня:
Вы можете отключить прокрутку, заморозив RecyclerView.
Создать класс, который расширяет класс RecyclerView
Это отключит событие прокрутки, но не события щелчка
Используйте это в своем XML, сделайте следующее:
Если вы просто отключить только функциональные возможности прокрутки в RecyclerView то вы можете использовать setLayoutFrozen(true); метод RecyclerView . Но нельзя отключить сенсорное событие.
Существует очень простой ответ.
Приведенный выше код отключает вертикальную прокрутку RecyclerView.
Еще одна альтернатива setLayoutFrozen , но она имеет множество других побочных эффектов.
Написал котлинскую версию:
Расширить LayoutManager и переопределить canScrollHorizontally() и canScrollVertically() отключить прокрутку.
Имейте в виду, что вставка элементов в начале не будет автоматически прокручиваться назад к началу, чтобы обойти это, сделайте что-то вроде:
Я знаю, что на это уже есть принятый ответ, но решение не учитывает вариант использования, с которым я столкнулся.
Мне особенно нужен был элемент заголовка, который можно было нажимать, но при этом отключить механизм прокрутки в RecyclerView. Это можно сделать с помощью следующего кода:
Как setLayoutFrozen не рекомендуется, Вы можете отключить прокрутку, заморозив RecyclerView с помощью suppressLayout .
в XML: —
в дочернем XML-файле макета RecyclerView
в Java: —
к вашему RecyclerView в коде Java.
Использование ViewCompat (Java): —
childRecyclerView.setNestedScrollingEnabled(false); будет работать только в android_version> 21 устройства. для работы на всех устройствах используйте следующее
По какой-то причине @Alejandro Gracia ответ начинает работать только через несколько секунд. Я нашел решение, которое мгновенно блокирует RecyclerView:
Переопределите onTouchEvent () и onInterceptTouchEvent () и верните false, если вам вообще не нужен OnItemTouchListener. Это не отключает OnClickListeners ViewHolders.
Вы можете добавить эту строку после настройки вашего адаптера
Теперь ваш переработчик будет работать с плавной прокруткой
Я боролся с этой проблемой в течение часа, поэтому я хотел бы поделиться своим опытом. Для решения layoutManager это хорошо, но если вы захотите включить прокрутку, то вернитесь к началу.
Лучшее решение (пока, по крайней мере, для меня) — это использование метода @Zsolt Safrany, но с добавлением геттера и сеттера, чтобы вам не пришлось удалять или добавлять OnItemTouchListener.
В Kotlin, если вы не хотите создавать дополнительный класс только для установки одного значения, вы можете создать анонимный класс из LayoutManager:
Вот как я это сделал с привязкой данных:
Вместо «true» я использовал логическую переменную, которая изменялась в зависимости от условия, чтобы представление рециркулятора переключалось между отключением и включением.
Столкнулся с фрагментом, который содержит несколько RecycleView, поэтому мне нужна только одна полоса прокрутки вместо одной полосы прокрутки в каждом RecycleView.
Поэтому я просто помещаю ScrollView в родительский контейнер, который содержит 2 RecycleViews, и использую его android:isScrollContainer=»false» в RecycleView.
в вашем дочернем элементе SrollView или NestedScrollView (и любой родительский элемент ListView, recyclerview и gridview любой)
Существует более простой способ отключить прокрутку (технически это скорее перехват события прокрутки и завершение его при выполнении условия), используя только стандартные функции. RecyclerView вызвал метод addOnScrollListener(OnScrollListener listener) , и с помощью этого вы можете остановить прокрутку, просто так:
Случай использования: допустим, вы хотите отключить прокрутку, когда нажимаете на один из элементов внутри, RecyclerView чтобы вы могли выполнять с ним некоторые действия, не отвлекаясь на случайную прокрутку на другой элемент, и когда вы закончите с этим, просто нажмите элемент снова, чтобы включить прокрутку. Для этого вы хотите прикрепить OnClickListener к каждому элементу внутри RecyclerView , поэтому, когда вы нажимаете на элемент, он переключается isItemSelected с false на true . Таким образом, когда вы попытаетесь прокрутить, RecyclerView автоматически вызовет метод onScrollStateChanged и, так как isItemSelected установлено значение true , он остановится немедленно, до RecyclerView возможность, ну . прокрутить.
Примечание: для удобства использования старайтесь использовать GestureListener вместо того, OnClickListener чтобы предотвращать accidental щелчки.
Источник