Я пытаюсь реализовать макет, который содержит RecyclerView и ScrollView в одном макете.
Шаблон макета:
<RelativeLayout>
<ScrollView android:id="@+id/myScrollView">
<unrelated data>...</unrealated data>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_recycler_view"
/>
</ScrollView>
</RelativeLayout>
Проблемы: я могу прокрутить до последнего элемента ScrollView
Вещи, которые я попробовал:
- Просмотр карты внутри
ScrollView
(теперьScrollView
содержитRecyclerView
) - можно увидеть карту доRecyclerView
- Первоначальная мысль заключалась в том, чтобы реализовать это,
viewGroup
используяRecyclerView
вместо того,ScrollView
где один из его типов представлений,CardView
но я получил те же результаты, что и сScrollView
NestedScrollView
вместо этого, поскольку оно решает множество проблем с прокруткойNestedScrollView
вместоScrollView
. Это именно то, для чего это.Ответы:
использовать
NestedScrollView
вместоScrollView
Пожалуйста, просмотрите справочный документ NestedScrollView для получения дополнительной информации.
и добавить
recyclerView.setNestedScrollingEnabled(false);
в свойRecyclerView
источник
android:layout_height="wrap_content"
для раздули для ViewHolderNestedScrollView
лаги для меня, в отличие отScrollView
. Поиск решения без использованияNestedScrollView
Я знаю, что опоздал в игре, но проблема все еще существует даже после того, как Google исправил
android.support.v7.widget.RecyclerView
Вопрос я получаю сейчас
RecyclerView
сlayout_height=wrap_content
не принимая высоту всего выпуска предметов внутри ,ScrollView
что только происходит на зефира и нуги + (API 23, 24, 25) версий.(ОБНОВЛЕНИЕ: замена
ScrollView
наandroid.support.v4.widget.NestedScrollView
работой на все версии я как - то пропустил тестирование. Общепринятое решения Добавлено это в моем GitHub проекте в качестве демо.) .Попробовав разные вещи, я нашел обходной путь, который решает эту проблему.
Вот моя структура макета в двух словах:
Обходной путь - обернуть
RecyclerView
сRelativeLayout
. Не спрашивайте меня, как я нашел этот обходной путь !!!¯\_(ツ)_/¯
Полный пример доступен на проекте GitHub - https://github.com/amardeshbd/android-recycler-view-wrap-content
Вот демонстрационный скриншот, показывающий исправление в действии:
источник
Хотя рекомендация
Это разумный совет, однако, если вы установите фиксированную высоту в окне рециркуляции, она должна работать нормально.
Если вы знаете высоту расположения элементов адаптера, вы можете просто рассчитать высоту RecyclerView.
источник
adapterItemSize
переменная?В случае, если установка фиксированной высоты для RecyclerView не работает для кого-то (как я), вот что я добавил в решение с фиксированной высотой:
источник
Новая библиотека Android Поддержка 23.2 решает эту проблему, теперь вы можете установить wrap_content как высота вашего
RecyclerView
и работает правильно.Библиотека поддержки Android 23.2
источник
RecyclerViews хорошо разместить в ScrollViews, если они не прокручивают сами себя. В этом случае имеет смысл установить фиксированную высоту.
Правильное решение заключается в использовании
wrap_content
высоты RecyclerView, а затем реализация пользовательского LinearLayoutManager, который может правильно обрабатывать перенос.Скопируйте этот LinearLayoutManager в свой проект: https://github.com/serso/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java
Затем оберните RecyclerView:
И настроить это так:
Редактировать: Это может вызвать сложности с прокруткой, потому что RecyclerView может украсть сенсорные события ScrollView. Мое решение состояло в том, чтобы просто отбросить RecyclerView и использовать LinearLayout, программно раздувать подпредставления и добавлять их в макет.
источник
Для
ScrollView
, вы можете использоватьfillViewport=true
и сделать,layout_height="match_parent"
как показано ниже, и поместить вид переработчика внутри:Дальнейшая регулировка высоты не требуется с помощью кода.
источник
Вычислять
RecyclerView
высоту вручную нехорошо, лучше использовать кастомLayoutManager
.Причина данного вопроса является любым видом , который имеет свой свиток (
ListView
,GridView
,RecyclerView
) не вычислить его высоту , когда добавить как ребенок в другой точке зрения есть свиток. Так что переопределение егоonMeasure
метода решит проблему.Пожалуйста, замените менеджер по умолчанию на следующее:
источник
Попробуй это. Очень поздний ответ. Но обязательно помогите кому-нибудь в будущем.
Установите для Scrollview значение NestedScrollView.
В вашем Recyclerview
источник
ОБНОВЛЕНИЕ: этот ответ устарел, так как есть виджеты, такие как NestedScrollView и RecyclerView, которые поддерживают вложенную прокрутку.
Вы никогда не должны помещать прокручиваемое представление в другое прокручиваемое представление!
Я предлагаю вам сделать ваш основной вид макета переработчиком и представить ваши взгляды как элементы представления переработчика.
взгляните на этот пример, который показывает, как использовать несколько представлений внутри адаптера представления переработчика. ссылка на пример
источник
Если вы положите
RecyclerView
внутрьNestedScrollView
и включитеrecyclerView.setNestedScrollingEnabled(false);
, прокрутка будет работать хорошо .Тем не менее, есть проблема
Например, у вас
RecyclerView
(внутриNestedScrollView
илиScrollView
) есть 100 предметов.При
Activity
запуске будет создано 100 элементов (onCreateViewHolder
иonBindViewHolder
100 элементов будут вызваны одновременно).Например, для каждого элемента вы загрузите большое изображение из API => действие создано -> 100 изображений будет загружено.
Это делает медленную стартовую активность и отставание.
Возможное решение :
- Думаю об использовании
RecyclerView
с несколькими типами.Однако, если в вашем случае, есть только несколько пункт в
RecyclerView
и рециркуляционных или не рецикле не влияет на производительность много, вы можете использоватьRecyclerView
внутриScrollView
для простогоисточник
RecyclerView
утилизацию после ее установкиScrollView
. Если вы хотите переработать, подумайте о другом подходе (например, об использовании RecyclerView с несколькими типами)Вы можете использовать этот способ либо:
Добавьте эту строку в ваше представление recyclerView xml:
попробуйте, реселлер-просмотр будет плавно прокручиваться с гибкой высотой
надеюсь, это помогло.
источник
Кажется,
NestedScrollView
это решает проблему. Я протестировал с помощью этого макета:И это работает без проблем
источник
Я использовал CustomLayoutManager, чтобы отключить прокрутку RecyclerView. Также не используйте Recycler View в качестве WrapContent, используйте его как 0dp, Weight = 1
Используйте CustomLayoutManager в RecyclerView:
UI XML:
источник
У меня была такая же проблема. Это то, что я пытался, и это работает. Я делюсь своим XML и Java-кодом. Надеюсь, это кому-нибудь поможет.
Вот это xml
Вот связанный код Java. Работает как часы.
источник
NestedScrollView
вместо просмотра прокруткиЭто делает трюк:
источник
На самом деле основная цель состоит в том
RecyclerView
, чтобы компенсироватьListView
иScrollView
. Вместо того, чтобы делать то, что вы на самом деле делаете: имеяRecyclerView
вScrollView
, я бы предложил иметь только тот,RecyclerView
который может обрабатывать многие типы детей.источник
Сначала вы должны использовать
NestedScrollView
вместоScrollView
и положитьRecyclerView
внутрьNestedScrollView
.Используйте класс Custom layout для измерения высоты и ширины экрана:
И внедрить приведенный ниже код в активность / фрагмент
RecyclerView
:источник
Если RecyclerView показывает только одну строку внутри ScrollView. Вам просто нужно установить высоту вашего ряда
android:layout_height="wrap_content"
.источник
Вы также можете переопределить LinearLayoutManager для плавного просмотра макулатуры.
источник
Извините, что опоздал на вечеринку, но, похоже, есть другое решение, которое идеально подходит для упомянутого вами случая.
Если вы используете представление рециркулятора внутри представления рециркулятора, оно, кажется, работает идеально. Я лично попробовал и использовал это, и это, кажется, не дает никакой медлительности и никакой отрывистости вообще. Теперь я не уверен, является ли это хорошей практикой или нет, но вложение нескольких представлений переработчика, даже вложенного представления прокрутки, замедляется. Но это, кажется, работает хорошо. Пожалуйста, попробуйте. Я уверен, что вложение будет прекрасно с этим.
источник
Другой подход к решению проблемы заключается в использовании
ConstraintLayout
внутриScrollView
:Но я все равно придерживаюсь
androidx.core.widget.NestedScrollView
подхода, предложенного Ян Пэйюном .источник
** Решение, которое работало для меня
Используйте NestedScrollView с высотой как wrap_content
// Ваше содержание строки идет сюда
источник