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>
il suffit d'activer le nidedscrolling pour permettre un défilement régulier.
RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);
Utilisez ceci dans votre recyclerView
app:layout_behavior="@string/appbar_scrolling_view_behavior"
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>
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
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);
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);
Il suffit de placer votre mise en page "non défilable" en dehors de la vue de défilement imbriquée
<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...