NestedScrollView内でRecyclerViewを使用する方法


210

RecyclerView内部での使用方法はNestedScrollViewRecyclerViewアダプタを設定した後、コンテンツが表示されません。

UPDATEレイアウトコードを更新しました。

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/keyline_1">

    </RelativeLayout>

    <View
        android:id="@+id/separator"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#e5e5e5" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/conversation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

</android.support.v4.widget.NestedScrollView>


@Mecid ScrollView(またはNestedScrollView)内でRecyclerViewを使用する理由はありません。
Gabriele Mariotti

2
@Mecidスクロール可能なビューを別のスクロール可能なビュー内に配置してはいけません。Androidでは原則です。
Gabriele Mariotti

6
@GabrieleMariotti私はこのルールを知っていますが、NestedScrollViewはこの問題を修正するために開発されました。
Mecid 2015年

1
不正解です。NestedScrollViewはScrollViewに似ていますが、ネストされたスクロールの親と子の両方として機能することをサポートしています。あなたのケースでは、独自のスクロール動作を定義する必要があります。
Gabriele Mariotti

回答:


216

recyclerViewを

<android.support.v7.widget.RecyclerView
    android:id="@+id/conversation"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

ここに、

app:layout_behavior="@string/appbar_scrolling_view_behavior"

残りのものを管理します。

もう1つ、recyclerViewをNestedScrollView内に配置する必要はありません。


33
なぜこのソリューションが最高の票を獲得しないのか理解できません。これは、と達成できないですNestedScrollViewが、ただでapp:layout_behavior="@string/appbar_scrolling_view_behavior"。これが鍵です!
秦、2015年

3
@RahulUpadhyayこれは私のために働きました、しかし私はあなたの最後の行が間違っていると思います、それがNestedScrollViewの中にあるならRecyclerViewはまったく表示されません。ただし、あなたはスーパースターです:D
Leon

3
できます!recyclerviewライブラリを更新するだけです 'com.android.support:recyclerview-v7:+'をコンパイルします
Fabio Guerra

28
この溶液を一緒に使用することを意図しているCoordinatorLayoutAppBarLayoutし、適切な設定layout_scrollFlagsをスクロールしなければならない子ビュー(秒)でRecyclerView。これが答えから省略された理由がわかりません。そうでなければ、これは素晴らしくてシンプルな解決策です。
Sanvywell

9
RecyclerViewのリサイクルはここでは機能しないことを理解することは非常に重要だと思います。その結果、アイテムのリストが長い場合、UIが著しくフリーズして表示されます。
Gaket 2017年

121

アップデート1

Android Support Library 23.2.0以降setAutoMeasureEnabled(true)、LayoutManagerのメソッドが追加されました。RecyclerViewでコンテンツをラップし、チャームのように機能します。
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

したがって、次のように追加するだけです。

    LayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setAutoMeasureEnabled(true);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setNestedScrollingEnabled(false);


アップデート2

27.1.0 setAutoMeasureEnabledは非推奨であるため、オーバーライドされたメソッドを使用してLayoutManagerのカスタム実装を提供する必要がありますisAutoMeasureEnabled()

しかし、RecyclerViewを何度も使用した後は、ラッピングモードで使用しないことを強くお勧めします。これは、意図したものではないためです。複数のアイテムのタイプを持つ通常の単一のRecyclerViewを使用して、レイアウト全体をリファクタリングしてみてください。または、最後の手段として以下で説明するLinearLayoutのアプローチを使用します


古い回答(非推奨)

RecyclerView内部で使用できますNestedScrollView。まず、独自のカスタムを実装する必要LinearLayoutManagerがありますRecyclerView。これにより、コンテンツがラップされます。例えば:

public class WrappingLinearLayoutManager extends LinearLayoutManager
{

    public WrappingLinearLayoutManager(Context context) {
        super(context);
    }

    private int[] mMeasuredDimension = new int[2];

    @Override
    public boolean canScrollVertically() {
        return false;
    }

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
            int widthSpec, int heightSpec) {
        final int widthMode = View.MeasureSpec.getMode(widthSpec);
        final int heightMode = View.MeasureSpec.getMode(heightSpec);

        final int widthSize = View.MeasureSpec.getSize(widthSpec);
        final int heightSize = View.MeasureSpec.getSize(heightSpec);

        int width = 0;
        int height = 0;
        for (int i = 0; i < getItemCount(); i++) {
            if (getOrientation() == HORIZONTAL) {
                measureScrapChild(recycler, i,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        heightSpec,
                        mMeasuredDimension);

                width = width + mMeasuredDimension[0];
                if (i == 0) {
                    height = mMeasuredDimension[1];
                }
            } else {
                measureScrapChild(recycler, i,
                        widthSpec,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        mMeasuredDimension);

                height = height + mMeasuredDimension[1];
                if (i == 0) {
                    width = mMeasuredDimension[0];
                }
            }
        }

        switch (widthMode) {
            case View.MeasureSpec.EXACTLY:
                width = widthSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        switch (heightMode) {
            case View.MeasureSpec.EXACTLY:
                height = heightSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        setMeasuredDimension(width, height);
    }

    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
            int heightSpec, int[] measuredDimension) {

        View view = recycler.getViewForPosition(position);
        if (view.getVisibility() == View.GONE) {
            measuredDimension[0] = 0;
            measuredDimension[1] = 0;
            return;
        }
        // For adding Item Decor Insets to view
        super.measureChildWithMargins(view, 0, 0);
        RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
        int childWidthSpec = ViewGroup.getChildMeasureSpec(
                widthSpec,
                getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view),
                p.width);
        int childHeightSpec = ViewGroup.getChildMeasureSpec(
                heightSpec,
                getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
                p.height);
        view.measure(childWidthSpec, childHeightSpec);

        // Get decorated measurements
        measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin;
        measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
        recycler.recycleView(view);
    }
}

その後、これLayoutManagerをあなたのために使用してくださいRecyclerView

recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));

ただし、次の2つのメソッドも呼び出す必要があります。

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

ここでのsetNestedScrollingEnabled(false)スクロールを無効にしてRecyclerView、からのスクロールイベントをインターセプトしないようにしNestedScrollViewます。そしてsetHasFixedSize(false)、アダプターの内容を変更すると、RecyclerView

重要な注意:このソリューションは、場合によっては少しバグがあり、パフォーマンスに問題があります。そのため、リストビューのRecyclerViewカスタムLinearLayoutベースの実装を使用することをお勧めします。アダプターのアナログを作成して作成します。ListViewまたはのように振る舞うRecyclerView


19
注意!に多数のアイテムがある場合は、これを使用しないでくださいRecyclerView
Brais Gabin、2015年

1
@BraisGabin、そうです:setHasFixedSize(false)はRecyclerViewを複数回更新するため、アイテムが多い場合は非常に遅くなります。これらの場合、ListViewまたはRecyclerViewのように動作させるために、一種のカスタム「アダプター」を使用してLinearLayoutを使用します
smbd uknow

1
どうもありがとう!時間を節約できました。ちなみに、このレイアウトマネージャーでは最後のアイテムの装飾が表示されません(このレイアウトマネージャーでのみ表示されます)。
Jjang

2
setAutoMeasureEnabledは、APIレベル27.1.0のよう推奨されていませんdeveloper.android.com/reference/android/support/v7/widget/...
DIKA

2
代わりにブールisAutoMeasureEnabled()をオーバーライドします。レイアウトの測定パスがRecyclerViewのAutoMeasureメカニズムを使用する必要があるか、それともLayoutManagerのonMeasure(Recycler、State、int、int)の実装によって実行される必要があるかを返します。このメソッドはデフォルトでfalseを返します(実際には非推奨のsetAutoMeasureEnabled(boolean)に渡された値を返します)。LayoutManagerがRecyclerViewによって自動測定される場合は、オーバーライドしてtrueを返す必要があります。このメソッドをオーバーライドしてtrueを返す場合、onMeasure(Recycler、State、int、int)をオーバーライドしないでください。
Peterstev Uremgba

100

1)上記のサポートライブラリ23.2.0(または)を使用する必要がある

2)とRecyclerView高さになりますwrap_content

3) recyclerView.setNestedScrollingEnabled(false)

しかし、これを行うと、リサイクラーパターンが機能しなくなります。(つまり、すべてのビューを一度にロードされますのでwrap_content、完全のニーズの高さRecyclerView、それはすべての子描画されますので、Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to useビュータイプand add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview`を。パフォーマンスへの影響は非常に高くなります。

簡単にするために、「LinearLayoutすべての子ビューと同じように機能する」


6
@Ashokに感謝します。設定recyclerView.setNestedScrollingEnabled(false)がスムーズなスクロールに役立ちました。
Shubhral 2016年

3
これは受け入れられる答えになるはずです!ビューは再利用されず、すべてのビューが一度に描画されることを指摘してください。
M'hamed

3
@AshokVarma、私が今直面している同じ問題。しかし、スクロールはrecyclerView内で正常に動作していますが、recyclerview描画のすべてのビューが一度にすべてのビューであるため、recyclerviewにエンドレススクロールを実装できなかったため、Webサービスの呼び出しを続行しました。どうすればこれを処理できますか?
Anantha Babu 2017

スクロールビューでrecyclerviewを使用する代わりに@AnanthaBabu。スクロールビューのすべてのアイテムをリサイクラービューのアイテムに変換します。recyclerviewsビュータイプを使用して、さまざまな種類のレイアウトをペイントできます。同様にこれらを処理するためのいくつかの優れたライブラリがあります(本当に複雑なビュー構造があり、再利用可能なコンポーネントが必要な場合は、ライブラリを使用してください)。
Ashok Varma 2017年

1
@AshokVarmaリサイクラーの動作問題の解決策はありますか?recyclerviewですべての子を一度に描画したくありません。
andro-girl

36

を使用android:fillViewport="true"してNestedScrollView測定できますRecyclerViewRecyclerView残りの高さを記入します。あなたがスクロールしたい場合はNestScrollView、あなたが設定できるRecyclerViewのをminHeight


14
200アイテムのrecyclerviewがあり、これを行う場合、nestedscrollviewは200アイテム全体に拡大されます!
RJFares 2017

1
@RJFaresそれは決して起こらなかった。私はデモを試して、LayoutInspectorを使用してレイアウトを検査しましたが、うまく機能します。recyclerViewのバージョンを提供できますか?
zayn 2017

26

recyclerView.setNestedScrollingEnabled(false);以前に追加するだけでsetAdapterうまくいきました。app:layout_behavior="@string/appbar_scrolling_view_behavior"どこにも追加せず、カスタムレイアウトマネージャーも設定していません

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                android:text="Some Text..."
                android:padding="15dp" />

        </LinearLayout>

        <LinearLayout
            android:orientation="vertical"
            android:padding="15dp"
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Quick Links"
                android:textColor="@color/black"
                android:textStyle="bold"
                android:textAllCaps="true"
                android:paddingLeft="20dp"
                android:drawableLeft="@drawable/ic_trending_up_black_24dp"
                android:drawablePadding="10dp"
                android:layout_marginBottom="10dp"
                android:textSize="16sp"/>

            <View
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#efefef"/>

            <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

10
しかし、今ではビューをリサイクルしませんか?
Mark Buikema 2017

いいえ、リサイクルしますね。
Vignesh Sundar 2017

6
いいえ、そうではありません。200アイテムの非常に複雑なレイアウトを試してみました。nestedscrollviewはその子のサイズに拡大するだけなので、拡大します。したがって、リサイクルは発生しません。@ MarkBuikemaより良い解決策を見つけましたか?
RJFares 2017

20

これは私のために働いているものです

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.v4.widget.NestedScrollView>

4
2番目のapp:layout_behavior = "@ string / appbar_scrolling_view_behavior"を削除できます。動作はCoordinatorLayoutの直接の子に対してのみ機能するためです。
Pepster

2
さらに、ルートレイアウトとしてCoordinatorレイアウトが必要であることを言及することが重要です。それは常に正しいとは限りません。
Gaket 2016

10

あなたがチェックする可能性のあるシンプルなテストコードがあります

<android.support.v4.widget.NestedScrollView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fillViewport="true"
     app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <android.support.v7.widget.RecyclerView
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
   </android.support.v4.widget.NestedScrollView>

9

以下のためにandroidxそれが呼ばれていますandroidx.core.widget.NestedScrollView-それはまた、プロパティと同様にバターをスクロールisScrollContainerし、measureAllChildren有効:

<!-- Scrolling Content -->
<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:isScrollContainer="true"
    android:measureAllChildren="true"

    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fastScrollEnabled="true"
        android:scrollbarStyle="insideInset"
        android:scrollbars="vertical"
        android:splitMotionEvents="false"
        android:verticalScrollbarPosition="right"/>

</androidx.core.widget.NestedScrollView>

7

このライブラリを使用してみてください-https://github.com/serso/android-linear-layout-manager

ライブラリのLayoutManagerは、RecyclerViewにそのコンテンツをラップさせます。この場合、RecyclerViewは「内部ビューと同じ大きさ」になるため、スクロールバーはなく、ユーザーはNestedScrollViewのスクロール機能を使用します。したがって、「scrollable inside scrollable」のように曖昧になることはありません。


1
これは、このライブラリーからLinearLayoutManagerのクラスである:github.com/serso/android-linear-layout-manager/blob/master/lib/...
コーディング忍者

6

以下は、スクロールの問題を回避するために使用しているコードです。

mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.getLayoutManager().setAutoMeasureEnabled(true);
mRecyclerView.setNestedScrollingEnabled(false);
mRecyclerView.setHasFixedSize(false);

6

NestedScrollView内でRecyclerViewを使用しましたが、うまくいきました。私が留意しなければならない唯一の落とし穴は、NestedScrollViewが子ビューを1つしか取らないことでした。したがって、私の場合、RecyclerViewと、必要な他のいくつかのビューを収容するLienearLayoutビューグループを使用しました。

RecyclerViewをNestedScrollView内に配置する際に1つの問題が発生します。RecyclerViewのコンテンツのスクロールが遅れていることに気付きました。

私は後で、RecyclerViewがスクロールイベントを受け取っているため、NestedScrollViewのスクロール動作と競合していることに気付きました。

したがって、その問題を解決するには、このメソッドでRecyclerViewのスクロール機能を無効にする必要がありました。 movieListNewRecyclerView.setNestedScrollingEnabled(false);

私が実際にやったことの短いビデオについては、私のInstagramをチェックアウトできます。これは私のInstagramハンドルofelix03です

この画像をクリックして、私がしたことを確認してください


5

NestedScrollView内にViewpagerとRecyclerViewがあります。以下の行を追加した後

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

遅いスクロールとスクロールラグの問題を解決しました。


3
どういう意味recyclerView.setHasFixedSize(true);ですか?
キノクレイトン

3

ネストされたスクロールビュー内でリサイクラービューを使用することはできません。これは、さらにスクロール可能なビューを含めることを意図していませんが、ネストされたスクロールビューが必要なのは、それ自体がスクロールレイアウトの子であるためです。同じ問題がありましたが、最終的にはテキストビューをリサイクラービュー内のヘッダービューに移動し、リサイクラービューをコーディネーターレイアウトの直接の子にし、ネストされたスクロールビューを削除しました。その後、私の問題はすべてなくなりました。


8
はをRecyclerView実装しているためNestedScrollingChildRecyclerViewを介してスクロールできるはずNestedScrollViewです。
ベンジャミン、

私は単に英語の間違いに基づいてstackoverflow.com/review/suggested-edits/9907622を拒否することを投票しましたが、そこには価値のある内容があるかもしれません-主題の知​​識を持って通り過ぎる人は誰でも見て、それらを確認する必要がありますそれをきれいにすることができます。そこに何も役に立たない場合は、このコメントにフラグを立てて、MODによる削除を依頼してください。
Mark Amery、2015年

3

RecyclerView-23.2.1以降ご利用の場合。次の解決策はうまくいきます:

レイアウトに次のようにRecyclerViewを追加します。

<android.support.v7.widget.RecyclerView
        android:id="@+id/review_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical" />

そしてあなたのjavaファイルで:

RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager=new LinearLayoutManager(getContext());
layoutManager.setAutoMeasureEnabled(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(new YourListAdapter(getContext()));

ここでlayoutManager.setAutoMeasureEnabled(true);トリックを行います。

詳細についてはこの問題この開発者ブログを確認してください。


「mRecyclerView.setHasFixedSize(true);」の使用には注意してください でも。実行時にリサイクラービューでアイテムを追加または削除しない場合にのみ使用できます。
Gaket

2

recyclerviewのリサイクル機能を維持し、recyclerviewがすべてのデータをロードしないようにする1つの解決策は、recyclerview自体に修正の高さを設定することです。これを行うことにより、recyclerviewは、その高さがユーザーに表示できる限りロードするだけに制限されるため、下部/上部にスクロールした場合に要素をリサイクルします。


2

良い答えがたくさんあります。重要なのは、に設定nestedScrollingEnabledする必要があることですfalse。上記のように、Javaコードでそれを行うことができます。

mRecyclerView.setNestedScrollingEnabled(false);

ただし、XMLコード(android:nestedScrollingEnabled="false")で同じプロパティを設定することもできます。

 <android.support.v7.widget.RecyclerView
 android:id="@+id/recyclerview"
 android:nestedScrollingEnabled="false"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

2

あなたが使用している場合はRecyclerView ScrollListenerを内側にNestedScrollViewあなたは両方を使用している場合、addOnScrollListenerリスナーが正常に動作していません。

このコードを使用します。

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState); 
              ......
        }
    });

このコードはNestedScrollView内のRecyclerView ScrollListenerで正常機能します。

ありがとう


1

ツールバーのスクロール機能を備えたCoordinatorLayoutを実装する必要があり、1日中この問題をいじっていました。NestedScrollViewをまったく削除することで機能します。したがって、私はルートでRelativeLayoutを使用しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_nearby"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</RelativeLayout>

1

NestedScrollView内でrecyclerViewを使用しないでください。カスケード問題が発生する可能性があります。複数の種類のビューを処理するには、RecyclerViewでItemViewTypesを使用することをお勧めします。幅と高さがmatch_parentのRecyclerViewを追加するだけです。次に、recyclerViewAdapterでgetItemViewTypeをオーバーライドし、位置を使用して、膨張するレイアウトを処理します。その後、onBindViewHolderメソッドを使用してビューホルダーを処理できます。


1
nestedScrollView.setNestedScrollingEnabled(true);

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //...
        }
    });


<androidx.core.widget.NestedScrollView
    android:id="@+id/nested"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_below="@id/appBarLayout_orders"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <androidx.constraintlayout.widget.ConstraintLayout ...

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>

0

私はこの素晴らしい拡張機能を使用しました(kotlinで記述されていますが、Javaでも使用できます)

https://github.com/Widgetlabs/expedition-nestedscrollview

基本的に、NestedRecyclerViewすべてのパッケージの内部を取得するには、プロジェクトでutilsと言ってから、次のようにrecyclerviewを作成します

 <com.your_package.utils.NestedRecyclerView
      android:id="@+id/rv_test"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

Marc Knaupによるこの素晴らしい記事をチェックしてください

https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a


0

ネストされた スクロールビュー内ですべてのrecyclewビューの子を一度に読み込まないようにするためのソリューション

メリット:

  1. ネストされたスクロールビューを使用する場合、すべての子を一度にロードしない。
  2. パフォーマンスを向上させるためにrecycleView.setHasFixedSize(true)を使用できます
  3. Webサービスが一度にすべてのデータを送信するのを防ぎ、ページネーションが期待どおりに機能する
  4. 多数のデータセットに適しています。
  5. メモリの少ないデバイスに最適
  6. ネストされたスクロールを利用し続けることができます
  7. リサイクルビューのアイテムが複雑で、多くのリソースを必要とする場合に非常に役立ちます。

修正:

recycleviewmatch_parentまたはwrap_contentを使用する代わりに、xmlでfix heightを使用します


-5

NestedScrollViewを使用したRecyclerView

    <android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.