私のアプリでは、 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" />
やってみてください。
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 >
しかしながら、これはより長い道のりであり、もしあなたがカスタムのリニアレイアウトマネージャで問題なければ、リサイクラービューでネストスクロールを無効にするだけです。
サポートライブラリのv 23.2
リリースでは、すべてのデフォルトのLayoutManager
にファクトリの「ラップコンテンツ」機能が含まれるようになりました。私はそれをテストしませんでした、しかしあなたはおそらくあなたが使っていたそのライブラリよりそれを好むべきです。
<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とプログラムの両方の方法で試すことができます。しかし、あなたが直面するかもしれない問題は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);
私は同様の問題を抱えていました(私はGoogle PlayStoreデザインのような入れ子になったRecyclerViewsを作成しようとしました)。これに対処する最善の方法は、子のRecyclerViewsをサブクラス化し、 'onInterceptTouchEvent'メソッドと 'onTouchEvent'メソッドをオーバーライドすることです。このようにして、あなたはそれらのイベントがどのように振る舞うか、そして最終的にスクロールするかの完全なコントロールを得る。
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>
すべての回答の要約(利点と欠点)
シングルリサイクラービューの場合
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
あるいは、リサイクラービューにAndroid:focusableInTouchMode="true"
を設定することもできます。
<?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で動作しています
チャイルドビューで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これはあなたのヒントからのものです
カルティク
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);