Для своего приложения я использую RecyclerView
внутреннюю часть, ScrollView
где RecyclerView
высота зависит от ее содержимого с использованием этой библиотеки . Прокрутка работает, но не работает плавно, когда я прокручиваю RecyclerView
. Когда я прокручиваю ScrollView
сам, он прокручивается плавно.
Код, который я использую для определения RecyclerView
:
LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));
RecyclerView
В ScrollView
:
<android.support.v7.widget.RecyclerView
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:id="@+id/friendsList"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android
android-recyclerview
android-scrollview
android-scroll
Барт Бергманс
источник
источник
androidx.constraintlayout.widget.ConstraintLayout
которое решит вашу проблему без каких-либо сложных реализацийОтветы:
Попробуйте сделать:
RecyclerView v = (RecyclerView) findViewById(...); v.setNestedScrollingEnabled(false);
В качестве альтернативы вы можете изменить макет с помощью библиотеки поддержки дизайна. Я думаю, ваш текущий макет выглядит примерно так:
<ScrollView > <LinearLayout > <View > <!-- upper content --> <RecyclerView > <!-- with custom layoutmanager --> </LinearLayout > </ScrollView >
Вы можете изменить это на:
<CoordinatorLayout > <AppBarLayout > <CollapsingToolbarLayout > <!-- with your content, and layout_scrollFlags="scroll" --> </CollapsingToolbarLayout > </AppBarLayout > <RecyclerView > <!-- with standard layoutManager --> </CoordinatorLayout >
Однако это более долгий путь, и если вы в порядке с настраиваемым менеджером линейной компоновки, просто отключите вложенную прокрутку в представлении ресайклера.
Изменить (4/3/2016)
v 23.2
Выпуск поддержки библиотек в настоящее время включает в себя фабрику «содержание обертки» особенность во все по умолчаниюLayoutManager
s. Я не тестировал его, но вам, вероятно, следует предпочесть его той библиотеке, которую вы использовали.<ScrollView > <LinearLayout > <View > <!-- upper content --> <RecyclerView > <!-- with wrap_content --> </LinearLayout > </ScrollView >
источник
setNestedScrollingEnabled(false)
сработало только тогда, когда я вместо этого переключилScrollView
наNestedScrollView
.setNestedScrollingEnabled(false)
вернул мне плавную прокрутку с моейRecyclerView
внутренней сторонойScrollView
- Спасибо! Но я все еще не понимаю, почему это работает ...? Что на самом деле означает установка ложной вложенной прокрутки?android:nestedScrollingEnabled="false"
работает только для API 21+, ноv.setNestedScrollingEnabled(false)
подходит для <21.RecyclerView
то внутри есть проблема с wrap_content,ScrollView
которая возникает только на устройствах с зефиром / нугой (API 23, 24), проверьте мой способ решения на stackoverflow.com/a/38995399/132121Мне нужно было только использовать это:
mMyRecyclerView.setNestedScrollingEnabled(false);
в моем
onCreateView()
методе.Большое спасибо!
источник
Вы можете использовать этот способ:
Добавьте эту строку в свой xml-файл recyclerView:
android:nestedScrollingEnabled="false"
Или в java-коде:
RecyclerView.setNestedScrollingEnabled(false);
Надеюсь, это помогло.
источник
Вы можете попробовать как с XML, так и программно. Но проблема, с которой вы можете столкнуться, заключается в том, что (ниже API 21) выполнение этого с помощью XML не будет работать. Так что лучше установить его программно в Activity / Fragment.
Код XML:
<android.support.v7.widget.RecyclerView android:id="@+id/recycleView" android:layout_width="match_parent" android:visibility="gone" android:nestedScrollingEnabled="false" android:layout_height="wrap_content" android:layout_below="@+id/linearLayoutBottomText" />
Программно:
recycleView = (RecyclerView) findViewById(R.id.recycleView); recycleView.setNestedScrollingEnabled(false);
источник
Использование Nested Scroll View вместо Scroll View решило мою проблему
<LinearLayout> <!--Main Layout --> <android.support.v4.widget.NestedScrollView> <LinearLayout > <!--Nested Scoll View enclosing Layout -->` <View > <!-- upper content --> <RecyclerView > </LinearLayout > </android.support.v4.widget.NestedScrollView> </LinearLayout>
источник
У меня были похожие проблемы (я пытался создать вложенный RecyclerViews что-то вроде дизайна Google PlayStore). Лучший способ справиться с этим - создать подкласс дочернего RecyclerViews и переопределить методы onInterceptTouchEvent и onTouchEvent. Таким образом, вы получаете полный контроль над поведением этих событий и, в конечном итоге, прокруткой.
источник
Замена ScrollView на NestedScrollView привела к плавной прокрутке вниз.
источник
Резюме всех ответов (преимущества и недостатки)
Для одного ресайклервью
вы можете использовать его внутри макета Координатора.
Преимущество - он не загружает все элементы recyclerview. Такая плавная загрузка.
Недостаток - вы не можете загрузить два recyclerview внутри макета Координатора - возникают проблемы с прокруткой.
ссылка - https://stackoverflow.com/a/33143512/3879847
Для многократного повторного просмотра с минимальным количеством строк
вы можете загрузить внутри NestedScrollView
Преимущество - будет плавно прокручиваться
Недостаток - он загружает все строки recyclerview, поэтому ваша активность открывается с задержкой.
ссылка - https://stackoverflow.com/a/33143512/3879847
Для множественного повторного просмотра с большими строками (более 100)
Вы должны пойти с recyclerview.
Преимущество - плавная прокрутка, плавная загрузка
Недостаток - нужно писать больше кода и логики.
Загрузите каждый повторный просмотр в основной ресайклервью с помощью мультиэкранов
пример:
Ссылка для multi-viewHolder - https://stackoverflow.com/a/26245463/3879847
источник
Если вы используете VideoView или тяжелые виджеты в своих дочерних представлениях, сохраните RecyclerView с высотой
wrap_content
внутри NestedScrollView с высотой.match_parent
Тогда прокрутка будет работать гладко, как вы этого хотите.FYI,
<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:nestedScrollingEnabled="false" android:layout_height="wrap_content" android:clipToPadding="false" /> </android.support.v4.widget.NestedScrollView>
Спасибо, Micro, это было с твоей подсказки!
Картик
источник
Котлин
Набор
isNestedScrollingEnabled
дляfalse
для каждого RecyclerView , который находится под прокрутку зренияval recyclerView = findViewById<RecyclerView>(R.id.recyclerView) recyclerView.isNestedScrollingEnabled = false
Использование XML-макета
<android.support.v7.widget.RecyclerView android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:id="@+id/friendsList" android:layout_width="match_parent" android:nestedScrollingEnabled="false" android:layout_height="wrap_content" />
источник
Код XML:
<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" /> </android.support.v4.widget.NestedScrollView>
в java-коде:
recycleView = (RecyclerView) findViewById(R.id.recycleView); recycleView.setNestedScrollingEnabled(false);
источник
Или вы можете просто установить
android:focusableInTouchMode="true"
в своем режиме ресайклераисточник
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> <android.support.constraint.ConstraintLayout android:id="@+id/constraintlayout_main" android:layout_width="match_parent" android:layout_height="@dimen/layout_width_height_fortyfive" android:layout_marginLeft="@dimen/padding_margin_sixteen" android:layout_marginRight="@dimen/padding_margin_sixteen" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> <TextView android:id="@+id/textview_settings" style="@style/textviewHeaderMain" android:gravity="start" android:text="@string/app_name" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> </android.support.constraint.ConstraintLayout> <android.support.constraint.ConstraintLayout android:id="@+id/constraintlayout_recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/padding_margin_zero" android:layout_marginTop="@dimen/padding_margin_zero" android:layout_marginEnd="@dimen/padding_margin_zero" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:nestedScrollingEnabled="false" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> </android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout> </android.support.v4.widget.NestedScrollView> </android.support.constraint.ConstraintLayout>
Этот код работает в ConstraintLayout android
источник