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 выпуск библиотек поддержки теперь включает в себя заводскую функцию "обернуть содержимое" во всех стандартных LayoutManagers. Я не проверял это, но вы, вероятно, должны предпочесть его той библиотеке, которую вы использовали.

<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> можно рисовать на заднем плане элемента адаптера.

Моя проблема решена указанным выше решением, нижеприведенный вариант мне не полезен.

  1. setNestedScrollingEnabled
  2. setHasFixedSize
  3. setItemViewCacheSize

Просто добавьте эту строку в свой класс JAVA

      list.setNestedScrollingEnabled(false);
Другие вопросы по тегам