Как отключить прокрутку 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) , но все еще могу прокручивать.
Как отключить прокрутку?
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 переключился бы между отключением и включением.
Источник
Restore RecyclerView scroll position
You might have had the problem where a RecyclerView loses the scroll position when your Activity / Fragment is re-created. This usually happens because the Adapter data is loaded asynchronously and data hasn’t loaded by the time RecyclerView needs to layout so it fails to restore the scroll position.
Starting with 1.2.0-alpha02 , RecyclerView offers a new API to let the Adapter block layout restoration until it is ready. Read on to learn how to use this new API and how it works.
Restoring the scroll position
There are several ways to ensure a correct scroll position that you might have adopted. The best one is making sure that you always set the data on the Adapter before the first layout pass by caching the data you want to display in memory, in a ViewModel or in a repository. If this approach wasn’t possible, other solutions were either more complicated, like avoiding setting the Adapter on the RecyclerView , which can bring issues with items like headers, or misusing LayoutManager.onRestoreInstanceState API.
The recyclerview:1.2.0-alpha02 solution is a new Adapter method which allows you to set a state restoration policy (via the StateRestorationPolicy enum). This has 3 options:
- ALLOW — the default state, that restores the RecyclerView state immediately, in the next layout pass
- PREVENT_WHEN_EMPTY — restores the RecyclerView state only when the adapter is not empty ( adapter.getItemCount() > 0 ). If your data is loaded async, the RecyclerView waits until data is loaded and only then the state is restored. If you have default items, like headers or load progress indicators as part of your Adapter , then you should use the PREVENT option, unless the default items are added using ConcatAdapter (find out more here). ConcatAdapter waits for all of its adapters to be ready and only then it restores the state.
- PREVENT — all state restoration is deferred until you set ALLOW or PREVENT_WHEN_EMPTY .
Set the state restoration policy on the adapter like this:
That’s it! A short and sweet post to get you up to date with RecyclerView ’s lazy state restoration feature. Start using it 🏁👩💻👨💻!
Источник