ScrollView内のRecyclerviewがスムーズにスクロールしない


179

私のアプリのために私は使用していますRecyclerView内部のA 使用して、その内容に基づいて高さがあるこのライブラリを。スクロールは機能していますが、をスクロールするとスムーズに機能しません。自分自身をスクロールすると、スムーズにスクロールします。ScrollViewRecyclerViewRecyclerViewScrollView

私が定義するために使用しているコードRecyclerView

LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));

RecyclerViewScrollView

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

このソリューションは私にとって
有効

1
@tahaDevあなたのケースで正確に何が機能していないか、それについてさらに詳しく説明してください。また、あなたのケースでは提供された解決策が機能していないようです、そうですか?
Pravin Divraniya

androidx.constraintlayout.widget.ConstraintLayout複雑な実装なしで問題を解決する用途
Saswata

回答:


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 >

ただし、これは長い道のりであり、カスタム線形レイアウトマネージャーで問題がなければ、リサイクラービューでネストされたスクロールを無効にするだけです。

編集(2016年4月3日)

v 23.2サポートライブラリのリリースでは、すべてのデフォルトにファクトリの「コンテンツのラップ」機能が含まれるようになりましたLayoutManager。私はそれをテストしませんでした、しかしあなたはおそらくあなたが使っていたそのライブラリよりもそれを好むべきです。

<ScrollView >
   <LinearLayout >

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

   </LinearLayout >
</ScrollView >

16
この回答に追加するには:代わりsetNestedScrollingEnabled(false)にを切り替えたときにのみ機能しScrollViewましたNestedScrollView
Richard Le Mesurier 2016

11
私にとって、setNestedScrollingEnabled(false)私のRecyclerView内側でスムーズなスクロールを取り戻しましたScrollView-ありがとう!しかし、なぜそれが機能するのかまだわかりません...?ネストされたスクロールをfalseに設定するとはどういう意味ですか?
Micro

33
android:nestedScrollingEnabled="false"API 21+ でのみ機能しますがv.setNestedScrollingEnabled(false)、<21では問題ありません。
エリックB.

3
将来の参考のために、誰もが経験している場合RecyclerViewwrap_content発行の内部は、ScrollViewということだけマシュマロ/ヌガー(API 23、24)のデバイス上で発生した、で私の回避策を確認しstackoverflow.com/a/38995399/132121
ホサイン・カーン

2
私が現在経験しているこのソリューションの欠点は、RecyclerViewがonScrollListenerでイベントを受信しないことです。リサイクル業者に一定量のアイテムしかないときに、より多くのデータをフェッチしたいので、どちらが必要ですか
ダニエルW.

82

私はこれを使用する必要がありました:

mMyRecyclerView.setNestedScrollingEnabled(false);

私のonCreateView()方法では。

どうもありがとう!


26

次のいずれかの方法で使用できます。

次の行をrecyclerView xmlファイルに追加します。

android:nestedScrollingEnabled="false"

またはJavaコードで:

RecyclerView.setNestedScrollingEnabled(false);

これがお役に立てば幸いです。


10
Api 21+が必要
Muhammad Riyaz 2017年

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

同様の問題がありました(Google PlayStoreデザインのようなネストされたRecyclerViewsを作成しようとしました)。これに対処する最良の方法は、子RecyclerViewsをサブクラス化し、「onInterceptTouchEvent」および「onTouchEvent」メソッドをオーバーライドすることです。このようにして、これらのイベントがどのように動作し、最終的にスクロールするかを完全に制御できます。


3

ScrollViewをNestedScrollViewに置き換えると、下部までスムーズにスクロールしました。


1

チャイルドビューでVideoViewまたは重いウィジェットを使用している場合は、高さのwrap_content あるNestedScrollViewの内側に高さのあるRecyclerViewを維持してください。そうすれば、match_parent スクロールは思い通りにスムーズに機能します。

ご参考までに、

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

マイクロありがとうこれはあなたのヒントからでした!

Karthik


1

すべての回答の要約(長所と短所)

シングルrecyclerviewの場合

Coordinatorレイアウト内で使用できます。

利点 -recyclerviewアイテム全体をロードしません。とてもスムーズな読み込み。

欠点 -Coordinatorレイアウト内に2つのrecyclerviewをロードできない-スクロールの問題が発生する

参照 -https://stackoverflow.com/a/33143512/3879847

最小行の複数のRecylerViewの場合

NestedScrollView内にロードできます

利点 -スムーズにスクロールします

欠点-recyclerviewのすべての行が読み込まれるため、アクティビティが遅延して開きます

参照-https://stackoverflow.com/a/33143512/3879847

大きな行(100以上)を持つ複数のrecylerviewの場合

recyclerviewを使用する必要があります。

利点 -スムーズにスクロール、スムーズにロード

短所 -より多くのコードとロジックを作成する必要がある

マルチビューホルダーの助けを借りて、メインのrecyclerview内に各recylerviewをロードします

例:

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>

このコードはConstraintLayout androidで機能します


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" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.