android 滚动完整的 RelativeLayout 而不是仅滚动 RecyclerView
android scrolling full RelativeLayout instead of only RecyclerView
我在 Android activity 中有一个 RelativeLayout,其中包含书籍描述的数据(如您所知:标题、图片、摘要、作者...)
在布局的底部,我设置了一个 RecyclerView 用于显示来自用户的评论(缩略图、昵称、日期和评论)。
一切正常,但是当我有很多评论时,我只能滚动 RecyclerView,而不是整个 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"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_book_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/bookDetailThumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
fresco:placeholderImage="@drawable/not_available_thumbnail"
fresco:failureImage="@drawable/not_available_thumbnail"
fresco:actualImageScaleType="centerCrop"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/bookDetailTitle"
android:textAlignment="center"
android:textSize="40dp"
android:layout_below="@id/bookDetailThumbnail"
android:text="titulo"/>
<TextView
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/bookDetailTitle"
android:id="@+id/writtenByFieldName"
android:text="@string/written_by"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/summaryText"
android:layout_below="@id/writtenByFieldName"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/summaryText"
android:id="@+id/publishedOnFieldName"
android:text="@string/published_on"/>
<TextView
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/publishedOnFieldName"
android:id="@+id/ratingFieldName"
android:text="@string/rating_of_users"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bookDetailVersion"
android:layout_below="@id/ratingFieldName"
android:text="version"/>
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/loading_icon"
android:id="@+id/comments_loading_icon"
android:layout_below="@id/bookDetailVersion"
android:indeterminate="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/comments_loading_icon"
android:id="@+id/loading_comments_text"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/loading_comments_text"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/commentsList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/bookDetailVersion"
android:visibility="invisible"/>
最初我虽然应该使用 ScrollView,但正如官方 Google 文档中关于 ScrollView 所提到的那样:永远不要将 RecyclerView 或 ListView 添加到滚动视图。这样做会导致用户界面性能不佳和用户体验不佳
那么,如何在滚动用户评论时滚动完整的Relative布局呢?
您可以添加包含所有布局的 NestedScrollView。
在此示例中,图像和列表项一起滚动。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@id/cover"
android:layout_width="match_parent"
android:layout_height="250dp"
android:contentDescription="@string/app_name"/>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/cover" />
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
嵌套滚动更好用NestedScrollView
NestedScrollView as the name suggests is used when there is a need for a scrolling view inside another scrolling view.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
// add here all your controlls
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/cover" />
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
并且不要忘记在 RecyclerView
中设置 setNestedScrollingEnabled()
属性 就像下面的代码
mRecyclerView.setNestedScrollingEnabled(false);
我在 Android activity 中有一个 RelativeLayout,其中包含书籍描述的数据(如您所知:标题、图片、摘要、作者...)
在布局的底部,我设置了一个 RecyclerView 用于显示来自用户的评论(缩略图、昵称、日期和评论)。
一切正常,但是当我有很多评论时,我只能滚动 RecyclerView,而不是整个 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"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_book_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/bookDetailThumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
fresco:placeholderImage="@drawable/not_available_thumbnail"
fresco:failureImage="@drawable/not_available_thumbnail"
fresco:actualImageScaleType="centerCrop"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/bookDetailTitle"
android:textAlignment="center"
android:textSize="40dp"
android:layout_below="@id/bookDetailThumbnail"
android:text="titulo"/>
<TextView
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/bookDetailTitle"
android:id="@+id/writtenByFieldName"
android:text="@string/written_by"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/summaryText"
android:layout_below="@id/writtenByFieldName"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/summaryText"
android:id="@+id/publishedOnFieldName"
android:text="@string/published_on"/>
<TextView
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/publishedOnFieldName"
android:id="@+id/ratingFieldName"
android:text="@string/rating_of_users"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bookDetailVersion"
android:layout_below="@id/ratingFieldName"
android:text="version"/>
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/loading_icon"
android:id="@+id/comments_loading_icon"
android:layout_below="@id/bookDetailVersion"
android:indeterminate="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/comments_loading_icon"
android:id="@+id/loading_comments_text"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/loading_comments_text"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/commentsList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/bookDetailVersion"
android:visibility="invisible"/>
最初我虽然应该使用 ScrollView,但正如官方 Google 文档中关于 ScrollView 所提到的那样:永远不要将 RecyclerView 或 ListView 添加到滚动视图。这样做会导致用户界面性能不佳和用户体验不佳
那么,如何在滚动用户评论时滚动完整的Relative布局呢?
您可以添加包含所有布局的 NestedScrollView。
在此示例中,图像和列表项一起滚动。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@id/cover"
android:layout_width="match_parent"
android:layout_height="250dp"
android:contentDescription="@string/app_name"/>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/cover" />
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
嵌套滚动更好用NestedScrollView
NestedScrollView as the name suggests is used when there is a need for a scrolling view inside another scrolling view.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
// add here all your controlls
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/cover" />
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
并且不要忘记在 RecyclerView
中设置 setNestedScrollingEnabled()
属性 就像下面的代码
mRecyclerView.setNestedScrollingEnabled(false);