web-dev-qa-db-fra.com

Comment utiliser RecyclerView dans NestedScrollView

J'ai cette mise en page:

 <Android.support.v4.widget.NestedScrollView
    Android:id="@+id/scrollview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <LinearLayout
        Android:id="@+id/content"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

            <--There is some layouts here-->
            <RecyclerView
                Android:id="@+id/recycler_view"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"/>
    </LinearLayout>

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

Ça marche bien. Je peux faire défiler RecyclerView en douceur sans faire défiler la vue parent. 

Maintenant, je dois mettre la RecyclerView dans une FrameLayout comme ceci:

 <Android.support.v4.widget.NestedScrollView
    Android:id="@+id/scrollview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <LinearLayout
        Android:id="@+id/content"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">
 <--There is some layouts here-->
        <FrameLayout
            Android:id="@+id/review_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content">

            <RecyclerView
                Android:id="@+id/recycler_view"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"/>

            <include
                Android:id="@+id/empty_view"
                layout="@layout/review_empty_view"
                Android:visibility="gone" />
        </FrameLayout>
    </LinearLayout>

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

Maintenant, je ne peux pas faire défiler la RecyclerView en douceur. Tout ce que je veux, c’est: faire défiler RecyclerView en douceur sans faire défiler la vue parent. Que devrais-je faire?

EDIT: Voici ma mise en page review_empty:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center"
    Android:orientation="horizontal"
    Android:padding="16dp">

    <ImageView
        Android:layout_width="80dp"
        Android:layout_height="80dp"
        Android:src="@drawable/shopping_review_empty" />

    <Android.support.v4.widget.Space
        Android:layout_width="32dp"
        Android:layout_height="0dp" />

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@string/shopping_no_review_message" />
</LinearLayout>
5
TOP

il suffit d'activer le nidedscrolling pour permettre un défilement régulier. 

RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);
2
jai khambhayta

Utilisez ceci dans votre recyclerView 

app:layout_behavior="@string/appbar_scrolling_view_behavior"
2
Randhir Gupta

Je vous suggère de faire comme ça. Lorsque vous obtenez des données vides, définissez simplement Visibilité de la visionneuse de recycleur sur Fini et définissez Visibilité de la vue vide comme visible.

Voici le code: 

<Android.support.design.widget.CoordinatorLayout 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:background="@color/white"
Android:fitsSystemWindows="true">

<Android.support.design.widget.AppBarLayout
    Android:id="@+id/appbar"
    Android:layout_width="match_parent"
    Android:layout_height="400dp"
    Android:background="@color/bg"
    Android:fitsSystemWindows="true"
    Android:theme="@style/AppTheme.AppBarOverlay">

    <Android.support.design.widget.CollapsingToolbarLayout
        Android:id="@+id/collapsingToolbar"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:gravity="center"
            Android:orientation="vertical"
            app:layout_collapseMode="parallax">

            <FrameLayout
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="@dimen/scale_30dp">

                <include layout="@layout/image_loading_progress" />

                <com.thenakedconvos.stories.utils.CircularImageView
                    Android:id="@+id/ivProfile"
                    Android:layout_width="@dimen/scale_90dp"
                    Android:layout_height="@dimen/scale_90dp"
                    Android:transitionName="@string/transition_image" />

            </FrameLayout>

            <com.thenakedconvos.stories.widget.CustomTextView
                Android:id="@+id/tvUserName"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="@dimen/scale_15dp"
                Android:textColor="@color/black"
                Android:textSize="16sp"
                Android:transitionName="@string/transition_text"
                app:typeface="gotham_medium" />

            <com.thenakedconvos.stories.widget.CustomTextView
                Android:id="@+id/tvHoots"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="@dimen/scale_5dp"
                Android:textColor="@color/text_color"
                Android:textSize="12sp"
                app:typeface="gotham_book" />

            <com.vanniktech.emoji.EmojiTextView
                Android:id="@+id/tvSmiley"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="@dimen/scale_10dp"
                Android:textIsSelectable="true"
                app:emojiSize="25sp" />

            <com.thenakedconvos.stories.widget.CustomTextView
                Android:id="@+id/tvAddFriend"
                Android:layout_width="140dp"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="@dimen/scale_15dp"
                Android:background="@drawable/red_rect_box"
                Android:gravity="center"
                Android:paddingBottom="@dimen/scale_12dp"
                Android:paddingTop="@dimen/scale_12dp"
                Android:text="Add"
                Android:textColor="@color/red"
                Android:textSize="14sp" />

        </LinearLayout>

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="?attr/colorPrimary"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:theme="@style/AppTheme">

            <com.thenakedconvos.stories.widget.CustomTextView
                Android:id="@+id/tvTitle"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:textColor="@color/text_color"
                Android:textSize="18sp"
                app:typeface="bariol_bold" />
        </Android.support.v7.widget.Toolbar>

    </Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>

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

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center_horizontal"
        Android:orientation="vertical">


        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_marginTop="@dimen/scale_15dp"
            Android:background="@color/white"
            Android:orientation="vertical"
            Android:padding="@dimen/scale_16dp">

            <com.thenakedconvos.stories.widget.CustomTextView
                Android:id="@+id/tvUserStory"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:text="Amy N. Johnson's Stories"
                Android:textColor="@color/black"
                Android:textSize="15sp"
                app:typeface="bariol_bold" />

            <com.thenakedconvos.stories.widget.CustomTextView
                Android:id="@+id/tvTotalStories"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="@dimen/scale_5dp"
                Android:text="110 Stories"
                Android:textColor="@color/text_color"
                Android:textSize="13sp"
                app:typeface="bariol_bold" />

            <Android.support.v7.widget.RecyclerView
                Android:id="@+id/recyclerView"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="@dimen/scale_10dp"
                Android:clipToPadding="false"
                Android:paddingTop="@dimen/scale_10dp" />

        </LinearLayout>
    </LinearLayout>
</Android.support.v4.widget.NestedScrollView>

1
Akash

Cela pourrait être une chance que vous chargiez des images (statiques) dans ImageView de ralentir votre recyclerView.

Ou grande taille de l'image.

Essayez d'exécuter une application sur mobile avec une bonne taille de RAM

1
ND1010_

Tout ce que vous avez à faire est d’utiliser la ligne ci-dessous dans votre classe d’activité:

ViewCompat.setNestedScrollingEnabled(recycler_view, false);

sa compatible pour les versions inférieures aussi. et si vous voulez rendre compatible avec API> 21 seulement alors utilisez;

  recycler_view.setNestedScrollingEnabled(false);
0
Riser

Ajouter fillViewport est vrai dans NestedScrollView au format XML comme ci-dessous:

<Android.support.v4.widget.NestedScrollView
            Android:id="@+id/nestedScrollView"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:fillViewport="true"
            Android:scrollbars="none">

Et dans votre activité setNested scrolling false comme code ci-dessous

recycler_view.setNestedScrollingEnabled(false);
0
Patrick R

Il suffit de placer votre mise en page "non défilable" en dehors de la vue de défilement imbriquée

0
mhdjazmati
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<LinearLayout
    Android:id="@+id/content"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <FrameLayout
        Android:id="@+id/review_layout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">
       <ScrollView
          Android:layout_width="fill_parent"
          Android:layout_height="fill_parent"
          Android:layout_weight="1" >
    <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">
        <RecyclerView
            Android:id="@+id/recycler_view"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"/>
            </LinearLayout>
            </ScrollView>
        <include
            Android:id="@+id/empty_view"
            layout="@layout/review_empty_view"
            Android:visibility="gone" />
    </FrameLayout>
</LinearLayout>

</LinearLayout>

Essaye ça...

0
Chandana_Raj