web-dev-qa-db-ja.com

ScrollView内のリサイクルビューがスムーズにスクロールしない

私のアプリでは、 this library を使って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" />
156
Bart Bergmans

やってみてください。

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にファクトリの「ラップコンテンツ」機能が含まれるようになりました。私はそれをテストしませんでした、しかしあなたはおそらくあなたが使っていたそのライブラリよりそれを好むべきです。

<ScrollView >
   <LinearLayout >

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

   </LinearLayout >
</ScrollView >
345
natario

私はこれを使うだけでした:

mMyRecyclerView.setNestedScrollingEnabled(false);

私のonCreateView()メソッドで。

どうもありがとう!

71
Victor Augusto

この方法を使うことができます:

この行をrecyclerView xmlに追加します。

Android:nestedScrollingEnabled="false"

またはJavaコードで:

RecyclerView.setNestedScrollingEnabled(false);

これが助けになることを願っています。

26
tahaDev

XMLとプログラムの両方の方法で試すことができます。しかし、あなたが直面するかもしれない問題はXMLでそれをすることによって(API 21の下で)うまくいかないでしょう。それで、あなたの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);
8
Pramod Baggolli

私は同様の問題を抱えていました(私はGoogle PlayStoreデザインのような入れ子になったRecyclerViewsを作成しようとしました)。これに対処する最善の方法は、子のRecyclerViewsをサブクラス化し、 'onInterceptTouchEvent'メソッドと 'onTouchEvent'メソッドをオーバーライドすることです。このようにして、あなたはそれらのイベントがどのように振る舞うか、そして最終的にスクロールするかの完全なコントロールを得る。

3
mahabudhi

Scroll Viewの代わりにNested 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>
2
Siddy Hacks

すべての回答の要約(利点と欠点)

シングルリサイクラービューの場合

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

Advantage-recyclerviewアイテム全体をロードしません。とてもスムーズなロード。

欠点-コーディネーターレイアウト内に2つのrecyclerviewをロードすることはできません-スクロールの問題が発生します

リファレンス- https://stackoverflow.com/a/33143512/3879847

最小行の複数のレシラービューの場合

nestedScrollView内にロードできます

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

短所-recyclerviewのすべての行をロードするため、アクティビティは遅延して開きます

リファレンス- https://stackoverflow.com/a/33143512/3879847

大きな行(100を超える)を持つ複数のrecylerviewの場合

あなたはrecyclerviewで行かなければなりません。

Advantage-スムーズにスクロール、スムーズにロード

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

マルチビューホルダーの助けを借りて、メインのリサイクラビュー内に各レシラービューをロードします

例:

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1)

-ChildRecyclerview2 (ViewHolder2)

-ChildRecyclerview3 (ViewHolder3) 

-Any other layout   (ViewHolder4)

Multi-viewHolderのリファレンス- https://stackoverflow.com/a/26245463/3879847

0
Ranjith Kumar

あるいは、リサイクラービューにAndroid:focusableInTouchMode="true"を設定することもできます。

0
Sandeep Devrari
<?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
Hits sapra

チャイルドビューでVideoViewまたはヘビーウェイトウィジェットを使用している場合は、RecyclerViewをheight wrap_contentで、高さmatch_parentでNestedScrollView内に配置してください。

ちなみに、

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

Thanks Microこれはあなたのヒントからのものです

カルティク

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
Mohsinali