Recyclerview всередині ScrollView не прокручується плавно


179

Для свого додатка я використовую RecyclerViewвнутрішню частину a, 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" />

це рішення роботи для мене: stackoverflow.com/a/32390370/7308789 дякую
Хоссін Булла,

1
@tahaDev, що саме не працює у вашому випадку, будь ласка, детальніше про це детальніше. Крім того, здається, що жодні надані рішення не працювали у вашому випадку, чи не так?
Pravin Divraniya

Використовуйте, androidx.constraintlayout.widget.ConstraintLayoutщо вирішить вашу проблему без складних реалізацій
Сасвата

Відповіді:


379

Спробуйте зробити:

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.04.2016)

v 23.2Випуск підтримки бібліотек в даний час включає в себе фабрику «зміст обгортки» особливість в усі по замовчуванням LayoutManagers. Я не перевіряв його, але, мабуть, вам слід віддати перевагу цій бібліотеці, яку ви використовували.

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with wrap_content -->

   </LinearLayout >
</ScrollView >

16
Для того, щоб додати до цього відповіді: setNestedScrollingEnabled(false)тільки працював , коли я вимкнув ScrollViewдля NestedScrollViewзамість.
Річард Ле Месюр'є

11
Для мене setNestedScrollingEnabled(false)повернув мені плавне прокручування моєю RecyclerViewвнутрішньою частиною ScrollView- Спасибі! Але я досі не розумію, чому це працює ...? Що насправді означає встановити вкладене прокручування помилково?
Мікро

33
Зауважте, що android:nestedScrollingEnabled="false"працює лише для API 21+, але v.setNestedScrollingEnabled(false)це нормально для <21.
Ерік Б.

3
Для подальшої довідки, якщо хтось RecyclerViewусередині має проблему wrap_content, ScrollViewяка трапляється лише на пристроях зефір / нуга (API 23, 24), перевірте моє вирішення за адресою stackoverflow.com/a/38995399/132121
Hossain Khan

2
Недоліком цього рішення, яке я відчуваю зараз, є те, що RecyclerView не буде отримувати події в ньому onScrollListener. Що мені потрібно, тому що я хочу отримати більше даних, коли у мене є лише певна кількість предметів у переробнику
Daniel W.

82

Мені потрібно було лише скористатися цим:

mMyRecyclerView.setNestedScrollingEnabled(false);

в моєму onCreateView()методі.

Дуже дякую!


26

Ви можете використовувати такий спосіб:

Додайте цей рядок до файлу recilerView xml:

android:nestedScrollingEnabled="false"

Або в коді Java:

RecyclerView.setNestedScrollingEnabled(false);

Сподіваюся, що це допомогло.


10
вимагає Апі 21+
Мухаммед Ріяз

11

Можна спробувати обидва способи з 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);

6

Використання вкладеного перегляду прокрутки замість перегляду прокрутки вирішило мою проблему

<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>

5

У мене були подібні проблеми (я намагався створити вкладений RecyclerViews на кшталт дизайну Google PlayStore). Найкращий спосіб впоратися з цим - це підкласифікація дочірнього RecyclerViews та переміна методів "onInterceptTouchEvent" та "onTouchEvent". Таким чином ви отримуєте повний контроль над тим, як ведуть себе ці події та з часом прокручуються.


3

Заміна ScrollView на NestedScrollView призвела до плавного прокручування донизу.


1

Якщо ви використовуєте віджети 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>

Дякую Мікро, це було з вашої підказки!

Картик


1

Підсумок всіх відповідей (переваги та недоліки)

Для одноразового перегляду рециркулятора

ви можете використовувати його всередині макета координатора.

Перевага - він не завантажує цілі елементи перегляду рециркулятора. Так плавне завантаження.

Недоліки - ви не можете завантажити два перегляду рециркулятора всередині макета Координатора - це створює проблеми прокрутки

довідка - https://stackoverflow.com/a/33143512/3879847

Для декількох повторних переглядів з мінімальними рядами

ви можете завантажити всередині NestedScrollView

Перевага - вона буде плавно прокручуватися

Недолік - він завантажує всі ряди рециркулятора, щоб ваша діяльність відкривалася із запізненням

довідка - https://stackoverflow.com/a/33143512/3879847

Для багаторазового перегляду з великими рядками (більше 100)

Ви повинні піти з переглядом рециркулятора.

Перевага - плавно прокручуйте, плавно завантажуйте

Недолік - Вам потрібно написати більше коду та логіки

Завантажте кожен перегляд рециркуляторів всередину основного рециркулятора за допомогою мультиплікаторів

колишній:

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1)

-ChildRecyclerview2 (ViewHolder2)

-ChildRecyclerview3 (ViewHolder3) 

-Any other layout   (ViewHolder4)

Довідка для Multi-viewHolder - https://stackoverflow.com/a/26245463/3879847


0

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);


0
<?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>

Цей код працює в android ConstraintLayout


0

Котлін

Набір 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" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.