Recyclerview внутри ScrollView не прокручивается плавно
Для моего приложения я использую 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" />
18 ответов
Попробуйте сделать:
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 >
Однако это более долгий путь, и если у вас все в порядке с пользовательским менеджером линейной разметки, просто отключите вложенную прокрутку в представлении рециркулятора.
Изменить (03.04.2016)
v 23.2
выпуск библиотек поддержки теперь включает в себя заводскую функцию "обернуть содержимое" во всех стандартных LayoutManager
s. Я не проверял это, но вы, вероятно, должны предпочесть его той библиотеке, которую вы использовали.
<ScrollView >
<LinearLayout >
<View > <!-- upper content -->
<RecyclerView > <!-- with wrap_content -->
</LinearLayout >
</ScrollView >
Мне нужно было только использовать это:
mMyRecyclerView.setNestedScrollingEnabled(false);
в моем onCreateView()
метод.
Большое спасибо!
Вы можете использовать этот способ либо:
Добавьте эту строку в свой recyclerView xml:
android:nestedScrollingEnabled="false"
или в коде Java:
RecyclerView.setNestedScrollingEnabled(false);
надеюсь, это помогло.
Вы можете попробовать оба способа с XML и программно. Но проблема, с которой вы можете столкнуться (ниже API 21) при работе с XML, не будет работать. Так что лучше установить это программно в вашей Деятельности / Фрагменте.
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>
Здесь все ответы одинаковы. и я уже использовал то, что всем предлагают. Затем я обнаружил, что NestedScrollView быстрее, чем ScrollView, поэтому
использовать
<androidx.core.widget.NestedScrollView
Вместо
<ScrollView
И используйте это как обычно
recycleView.setNestedScrollingEnabled(false);
У меня были похожие проблемы (я пытался создать вложенный RecyclerViews что-то вроде дизайна Google PlayStore). Лучший способ справиться с этим - создать подкласс дочерних объектов RecyclerViews и переопределить методы "onInterceptTouchEvent" и "onTouchEvent". Таким образом, вы получаете полный контроль над поведением этих событий и, в конечном итоге, прокруткой.
Замена ScrollView на NestedScrollView привела к плавной прокрутке вниз.
Котлин
Задавать 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" />
Резюме всех ответов (преимущества и недостатки)
Для одного ресайклервью
вы можете использовать его внутри макета Координатора.
Преимущество - он не загружает все элементы recyclerview. Такая плавная загрузка.
Недостаток - вы не можете загрузить два recyclerview внутри макета Координатора - возникают проблемы с прокруткой.
ссылка - /questions/34080334/recyclerview-vnutri-scrollview-ne-prokruchivaetsya-plavno/34080356#34080356
Для многократного повторного просмотра с минимальным количеством строк
вы можете загрузить внутри NestedScrollView
Преимущество - будет плавно прокручиваться
Недостаток - он загружает все строки recyclerview, поэтому ваша активность открывается с задержкой.
ссылка - /questions/34080334/recyclerview-vnutri-scrollview-ne-prokruchivaetsya-plavno/34080356#34080356
Для множественного повторного просмотра с большими строками (более 100)
Вы должны пойти с recyclerview.
Преимущество - плавная прокрутка, плавная загрузка
Недостаток - нужно писать больше кода и логики.
Загрузите каждый повторный просмотр в основной ресайклер-просмотр с помощью мультиэкранов
пример:
MainRecyclerview
-ChildRecyclerview1 (ViewHolder1) -ChildRecyclerview2 (ViewHolder2) -ChildRecyclerview3 (ViewHolder3) -Any other layout (ViewHolder4)
Ссылка для multi-viewHolder - /questions/41464882/kak-sozdat-recyclerview-s-neskolkimi-tipami-predstavleniya/41464900#41464900
Если вы используете 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>
Спасибо Микро, это было из твоего намека
Картик
вы можете использовать ScrollView в качестве родителя и NestedScrollView в качестве дочернего элемента. так:-
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/CL1">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/eventRV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/CL1" />
</androidx.core.widget.NestedScrollView>
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);
<?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
Или вы можете просто установить android:focusableInTouchMode="true"
по вашему мнению переработчик
У меня самого была эта проблема, в прокрутке есть представление ресайклера, и прокрутка не кажется гладкой. Причиной моей проблемы было наличие прокрутки поверх представления ресайклера, которое не было необходимо для моих требований. Итак, после того как я удалил прокрутку и добавил
android:scrollbars="vertical"
для ресайклера прокрутка была плавной.
После 3 дней исследований я решил проблему плавной прокрутки в своем проекте.
Проблема может быть установлена в фоновом режиме
item_user.xml
файл, поэтому для рендеринга требуется время графического процессора , поэтому прокрутка не плавная. Поэтому, пожалуйста, не используйте сложные
<layer-list>
можно рисовать на заднем плане элемента адаптера.
Моя проблема решена указанным выше решением, нижеприведенный вариант мне не полезен.
- setNestedScrollingEnabled
- setHasFixedSize
- setItemViewCacheSize
Просто добавьте эту строку в свой класс JAVA
list.setNestedScrollingEnabled(false);