Android recyclerview in scrollview

RecyclerView Scrolling Issue with NestedScrollView

Although RecyclerView has a very good and smooth scrolling built-in, but when you put into any ScrollView , then your RecyclerView ’s scrolling will not work. For example,

Now, the RecyclerView will not scroll. To fix that, you will have to use NestedScrollView instead of ScrollView like this:

Now, the RecyclerView will scroll but it will not be smooth. It will stop as soon as finger is off the screen resulting in a very stucking scrolling. To fix this issue, all you have to do is add this line after RecyclerView s adapter has been set.

Now, your RecyclerView will work with smooth scrolling. This same technique can be used in ViewPager when each Fragment have RecyclerView and the ViewPager is inside any CollapsingToolbarLayout .

If you liked this article, you can read my new articles below:

Asynchronous Calls in Koltin

A very common task in any android app is to hit any web service call and fetch some data from server. Google have always recommended to perform such heavy or time consuming calls in background thread, as if performed in main thread, these can block the UI and make the app irresponsive Traditionaly, developers use AsyncTask for these sorts of computations.

May 20, 2018

Firebase Notifications in Background & Foreground in Android

When developers need to integrate push notifications in their Android apps, the first thing comes in mind is Firebase Notifications or Firebase Messaging. But when they integrate, there are few common issues which they stuck into.

May 19, 2018

7 years experience. 💻 Creator of various Open Source libraries on Android . 📝 Author of two technical books and 100+ articles on Android. 🎤 A passionate Public Speaker giving talks all over the world.

Источник

[RecyclerView] no items are shown when the RecyclerView is wrapped inside a ScrollView. #199

Comments

LetaiefAymen commented Feb 14, 2017

Hi :), i made a test with the demo-cat-gallery , if the RecyclerView is inside a ScrollView then no items are shown at all for devices with Api level 21 (maybe lower API too), it works on API level 24, and it’s easily reproducible.

The text was updated successfully, but these errors were encountered:

eikaramba commented Feb 14, 2017

Also happens on lower API levels.

thagikura commented Feb 15, 2017

Oops, sorry for that.
Let me take a look at this.

thagikura commented Feb 20, 2017

After some investigation, found that if you add android:fillViewport=»true» to the parent ScrollView, the items in the RecyclerView should be shown with the FlexboxLayoutManager.

I’m wondering in what use case, RecyclerView in a ScrollView needed?
The solution above should work, but the RecyclerView doesn’t recycle the views off the screen if you do so.
It’s not recommended that you use a ListView (the document says ListView, but also applies to RecyclerView) in a ScrollView as explained in the Javadoc

LetaiefAymen commented Feb 22, 2017

Hi again :),
I just tried to provide you a simple use case where the items are not shown, and setting the fillViewport fix the issue in that use case but not in our use case.
Here is an overview on our use case :

I had to use a NestedScrollView in case the view gets bigger than the screen height,
currently i had to revert to StaggeredGridLayoutManager (like shown on the picture above), and changing the layout manager to FlexboxLayoutManager result to not showing the items at all (but it works fine with StaggeredGridLayoutManager even without adding the attribute android:fillViewport=»true» to the NestedScrollView). if i set the RecyclerView to have a static width or minWidth it shows the elements but i have to scroll inside the RecyclerView to see all the items (which is not the desired result), setting the flexDirection to FlexDirection.COLUMN result in showing all the elements but not if the flexDirection is set to FlexDirection.ROW.

Читайте также:  Brightness control on android

Since the normal LayoutManager are working fine but not the FlexboxLayoutManager , i guess that it might be a problem in the library (but i am not sure), as it should provide the same result in those specific conditions.

I hope you have a better idea about the issue in our use case :), especially that it is working fine on Api 24 or higher (so i could see all the items) but not on api 22 or lower.
I guess another choice for me would be to use the normal flexbox-layout and get rid of the RecyclerView but that would need some refactoring.

thagikura commented Feb 23, 2017

Thanks for the detailed clarification.
Looks like you are using the Flexbox as a structure for tags, so I highly recommend you to use FlexboxLayout instead of FlexboxLayoutManager for that use case because:

  • I guess the number of items is not going to be so large (like no less than 40)
  • FlexboxLayout is more stable than the alpha version of the FlexboxLayoutManager
  • Even if you use the StaggeredGridLayoutManager, the number of the columns can’t be changed dynamically, so I think you need to handle the number of columns depending on the width of the screen, which should be automatically taken care of if you use FlexboxLayout.

From looking at the behavior I think it’s issue with the FlexboxLayoutManager, I still haven’t spotted what part causes that.
So let me keep this issue open.

Источник

RecyclerView внутри ScrollView не работает

Я пытаюсь реализовать макет, который содержит RecyclerView и ScrollView в том же макете.

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

Вещи, которые я пробовал:

  • Переход от общего элемента не имеет ожидаемого поведения
  • Recycleview в Coordinatorlayout
  • RecyclerView прогностические анимации элементов не работают (ПОЯВЛЕНИЕ)
  • Twowayview автоматически добавляет отступы при прокрутке
  • LinearLayoutManager не может решить getOrientation ()
  1. Вид карты внутри ScrollView (теперь ScrollView содержит RecyclerView ) – может видеть карту до тех пор, пока RecyclerView
  2. Первоначальная мысль заключалась в том, чтобы реализовать эту viewGroup с использованием RecyclerView вместо ScrollView где одним из видов этого вида является CardView но я получил те же результаты, что и в ScrollView

Используйте NestedScrollView вместо ScrollView

Хотя рекомендация о том, что

Вы никогда не должны ставить прокручиваемое представление внутри другого прокручиваемого вида

Является хорошим советом, однако, если вы установите фиксированную высоту на просмотр ресайклера, он должен работать нормально.

Если вы знаете высоту макета элемента адаптера, вы можете просто вычислить высоту RecyclerView.

Я знаю, что я опаздываю на игру, но проблема все еще существует даже после того, как Google android.support.v7.widget.RecyclerView

Проблема, которую я получаю сейчас, – это RecyclerView с layout_height=wrap_content не занимающий высоту всех элементов, выпущенных внутри ScrollView что происходит только в ScrollView Marshmallow и Nougat + (API 23, 24, 25).
(ОБНОВЛЕНИЕ: Замена ScrollView с помощью android.support.v4.widget.NestedScrollView работает со всеми версиями. Я как-то пропустил тестирование принятого решения . Добавил это в мой проект github в качестве демонстрации.)

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

Вот моя структура макета в двух словах:

Обходной путь – обертка RecyclerView с RelativeLayout . Не спрашивайте меня, как я нашел это обходное решение! ¯\_(ツ)_/¯

Вот демонстрационный демонстрационный пример, показывающий исправление в действии:

Новая Android Support Library 23.2 решает эту проблему, теперь вы можете установить wrap_content как высоту вашего RecyclerView и работать правильно.

Библиотека поддержки Android 23.2

Если установка фиксированной высоты для RecyclerView не работала для кого-то (например, меня), вот что я добавил к решению фиксированной высоты:

RecyclerViews прекрасно вставляются в ScrollViews, если они не прокручиваются. В этом случае имеет смысл сделать его фиксированной высотой.

Правильное решение – использовать wrap_content на высоте RecyclerView, а затем реализовать пользовательский LinearLayoutManager, который может правильно обрабатывать упаковку.

Затем заверните RecyclerView:

И настройте его так:

Изменить: это может вызвать осложнения при прокрутке, поскольку RecyclerView может украсть события касания ScrollView. Мое решение состояло в том, чтобы полностью перерезать RecyclerView и перейти с LinearLayout, программно раздуть подзапросы и добавить их в макет.

Читайте также:  Поддержка flash player для android

Для ScrollView вы можете использовать fillViewport=true и make layout_height=»match_parent» как layout_height=»match_parent» ниже, и включить просмотр recycler внутри:

Никакой дополнительной регулировки высоты не требуется с помощью кода.

Вычисление высоты RecyclerView вручную не очень хорошо, лучше использовать пользовательский LayoutManager .

Причиной вышеупомянутой проблемы является любое представление, которое имеет его прокрутку ( ListView , GridView , RecyclerView ) не удалось вычислить его высоту, когда добавление в качестве дочернего объекта в другом представлении имеет прокрутку. Поэтому переопределение метода onMeasure решит проблему.

Пожалуйста, замените менеджер компоновки по умолчанию следующим:

ОБНОВЛЕНИЕ: этот ответ уже устарел, поскольку существуют такие виджеты, как NestedScrollView и RecyclerView, которые поддерживают вложенную прокрутку.

Вы никогда не должны ставить прокручиваемое представление в другое прокручиваемое представление!

Я предлагаю вам сделать ваш основной вид ресайклера макета и поместить ваши представления в качестве элементов просмотра ресайклеров.

Взгляните на этот пример, он показывает, как использовать несколько видов в адаптере просмотра recycler. Ссылка на пример

Кажется, что NestedScrollView действительно решает проблему. Я тестировал этот макет:

И это работает без проблем

У меня была такая же проблема. Это то, что я пытался, и это работает. Я делюсь своим xml и java-кодом. Надеюсь, это поможет кому-то.

Вот связанный Java-код. Отлично работает.

На самом деле главной задачей RecyclerView является компенсация ListView и ScrollView . Вместо того, чтобы делать то, что вы на самом деле делаете: имея RecyclerView в ScrollView , я предлагаю иметь только RecyclerView который может обрабатывать многие типы детей.

Вот мое рабочее решение: для RecyclerView лучше вычислить высоту контента и установить фиксированную высоту.

Сначала вы должны использовать NestedScrollView вместо ScrollView и поместить RecyclerView внутри NestedScrollView .

Используйте собственный класс макета для измерения высоты и ширины экрана:

И реализовать ниже код в активности / фрагменте RecyclerView :

Если RecyclerView показывает только одну строку внутри ScrollView. Вам просто нужно установить высоту строки для android:layout_height=»wrap_content» .

Вы можете использовать этот способ:

Добавьте эту строку в свой вид recyclerView xml:

Попробуйте, recyclerview будет плавно прокручиваться с гибкой высотой

Надеюсь, это помогло.

Вы также можете переопределить LinearLayoutManager, чтобы сделать recyclerview roll гладко

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

Если вы используете просмотр ресайклера в представлении ресайклера, он работает отлично. Я лично пробовал и использовал его, и он, кажется, не дает ни медлительности, ни отрывистости вообще. Теперь я не уверен, что это хорошая практика или нет, но вложенные множественные просмотры recycler, даже вложенный просмотр прокрутки замедляется. Но это, похоже, работает красиво. Пожалуйста, попробуйте. Я уверен, что гнездование будет в порядке.

** Решение, которое работало для меня
Использовать NestedScrollView с высотой как wrap_content
RecyclerView с android: layout_width = «match_parent»
андроид: layout_height = «wrap_content»
андроид: nestedScrollingEnabled = «ложь»
App: layoutManager = «android.support.v7.widget.LinearLayoutManager» tools: targetApi = «lollipop»

И вид держателя
андроид: layout_width = «match_parent»
Android: layout_height = «wrap_content» // Содержимое вашей строки идет здесь

Источник

RecyclerView внутри ScrollView не работает

Я пытаюсь реализовать макет, который содержит RecyclerView и ScrollView в одном макете.

проблемы: я могу прокручивать до последнего элемента ScrollView

вещи, которые я пробовал:

  1. вид карты внутри ScrollView (ныне ScrollView содержит RecyclerView ) — можно увидеть карту до RecyclerView
  2. первоначальной мыслью было реализовать это viewGroup используя RecyclerView вместо ScrollView где одним из его типов представлений является CardView но я получил те же результаты, что и с ScrollView

21 ответов

использовать NestedScrollView вместо ScrollView

перейдите через справочный документ NestedScrollView для получения дополнительной информации.

и добавить recyclerView.setNestedScrollingEnabled(false); на RecyclerView

Я знаю, что я опоздал в игру, но проблема все еще существует даже после того, как google сделал исправление на android.support.v7.widget.RecyclerView

проблема, которую я получаю сейчас, это RecyclerView С layout_height=wrap_content не принимая высоту всех пунктов вопроса внутри ScrollView это только происходит в версиях Marshmallow и Nougat+ (API 23, 24, 25).
(обновление: замена ScrollView С android.support.v4.widget.NestedScrollView работает на всех версиях. Я как-то пропустил тестирование принято решение. Добавил Это в мой github проект как демо.)

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

вот моя структура макета в двух словах:

обходным путем является обертывание RecyclerView С RelativeLayout . Не спрашивайте меня, как я нашел обходной путь. ¯\_(ツ)_/¯

вот демо скринкаст, показывающий исправление в действии:

хотя рекомендация, что

вы никогда не должны помещать прокручиваемый вид внутри другого прокручиваемого вида

— это здравый совет, однако, если вы установите фиксированную высоту на представлении recycler, он должен работать нормально.

Читайте также:  Андроид для девушек мода

Если вы знаете высоту макета элемента адаптера, вы можете просто рассчитать высоту RecyclerView.

если установка фиксированной высоты для RecyclerView не работала для кого-то (например, для меня), вот что я добавил к решению фиксированной высоты:

новая Библиотека Поддержки Android 23.2 решает эту проблему, теперь вы можете установить wrap_content в качестве параметров как высота RecyclerView и работает правильно.

RecyclerViews можно поместить в ScrollViews, если они не прокручиваются сами. В этом случае, имеет смысл сделать его фиксированной высоте.

правильное решение-использовать wrap_content на высоте RecyclerView, а затем реализовать пользовательский LinearLayoutManager, который может правильно обрабатывать обертку.

затем оберните RecyclerView:

и настроить его так:

Edit: это может вызвать осложнения с прокруткой, потому что RecyclerView может украсть события касания ScrollView. Мое решение состояло в том, чтобы просто выбросить RecyclerView во всех и пойти с LinearLayout, программно раздуть подвиды и добавить их в макет.

на ScrollView , вы могли бы использовать fillViewport=true и сделать layout_height=»match_parent» как показано ниже, и поместите recycler view внутрь:

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

расчета RecyclerView высота вручную не хороша, лучше использовать пользовательский LayoutManager .

причиной вышеуказанной проблемы является любое представление, которое имеет прокрутку ( ListView , GridView , RecyclerView ) не удалось вычислить его высоту, когда add как дочерний в другом представлении имеет прокрутку. Так перекрывает ее onMeasure метод решить проблему.

пожалуйста, замените диспетчер макетов по умолчанию следующим:

попробуйте это. Очень поздний ответ. Но, безусловно, помочь кому-либо в будущем.

установите Scrollview в NestedScrollView

в Recyclerview

обновление: этот ответ устарел, так как есть виджеты, такие как NestedScrollView и RecyclerView, которые поддерживают вложенную прокрутку.

вы никогда не должны положить прокрутки внутри другого прокрутки !

Я предлагаю вам сделать свой основной вид макета recycler и поместить ваши представления в качестве элементов представления recycler.

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

вы можете использовать этот способ :

добавьте эту строку в xml-представление recyclerView:

попробуйте, recyclerview будет плавно прокручиваться с гибкой высотой

надеюсь, что это помогло .

Кажется, NestedScrollView решает проблему. Я тестировал с помощью этого макета:

и все работает без проблем

у меня была та же проблема. Это то, что я пробовал, и это работает. Я делюсь своим кодом xml и java. Надеюсь, это кому-то поможет.

вот связанный java-код. Это работает как шарм.

это делает трюк:

если поставить RecyclerView внутри NestedScrollView и включения recyclerView.setNestedScrollingEnabled(false); , прокрутка работает хорошо.
Однако, есть проблема

RecyclerView не рециркулирует

например, RecyclerView (внутри NestedScrollView или ScrollView ) есть 100 пункт.
Когда Activity запуск, 100 элементов создать ( onCreateViewHolder и onBindViewHolder 100 пункт будет вызван в то же время).
Например, для каждый элемент, вы будете загружать большое изображение из API = > activity created — > 100 изображение будет загружаться.
Это делает начальную активность медленной и отстающей.
возможное решение:
— Думая об использовании RecyclerView с несколькими типа.

однако, если в вашем случае, есть только несколько элементов в RecyclerView и корзина или не рециркулирует не влияют на производительность много, вы можете использовать RecyclerView внутри ScrollView простые

главная цель RecyclerView компенсировать ListView и ScrollView . Вместо того, чтобы делать то, что вы на самом деле делаете: иметь RecyclerView на ScrollView , Я бы предложил иметь только RecyclerView Это может обрабатывать многие типы детей.

во-первых, вы должны использовать NestedScrollView вместо ScrollView и поставить RecyclerView внутри NestedScrollView .

используйте пользовательский класс макета для измерения высоты и ширины экрана:

и выполнить ниже код в деятельности/фрагмент RecyclerView :

Если RecyclerView показывает только одну строку внутри ScrollView. Вам просто нужно установить высоту строки android:layout_height=»wrap_content» .

вы также можете переопределить LinearLayoutManager, чтобы сделать рулон recyclerview плавным

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

Если вы используете представление recycler внутри представления recycler, он, кажется, работает отлично. Я лично пытался и использовал его, и это, кажется, дает не медлительность и не jerkyness на всех. Теперь я не уверен, что это хорошая практика или нет, но вложение нескольких представлений recycler , даже вложенный вид прокрутки замедляется. Но это, кажется, работает хорошо. Пожалуйста попробуй. Я уверен, что гнездование будет прекрасно с этим.

* * решение, которое сработало для меня
Используйте NestedScrollView с высотой как wrap_content

Источник

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