NestedScrollView 布局中的 RecyclerView 不滚动
RecyclerView within NestedScrollView Layout Not Scrolling
我在 NestedScrollView 中的 RecyclerView 中滚动时遇到一些问题,旁边是 CollapsingToolbarLayout。
问题是 RecyclerView 不滚动并且 CollapsingToolbarLayout 不 Expand/Collapse。
这是 XML:
<android.support.v4.widget.DrawerLayout 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:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"
tools:context=".MainActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/rootLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="256dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="12dp"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleTextAppearance="@color/trans"
app:layout_scrollFlags="scroll|enterAlwaysCollapsed">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/header" />
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/header_basij" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</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:fadeScrollbars="true"
android:fillViewport="true"
android:scrollbarDefaultDelayBeforeFade="1000"
android:scrollbarFadeDuration="2000"
android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:id="@+id/containerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<pl.droidsonroids.gif.GifImageView
android:id="@+id/pbar"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:background="@color/trans"
android:src="@drawable/loader"
/>
<LinearLayout
android:id="@+id/interneterror"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="vertical"
android:visibility="visible">
<TextView
android:id="@+id/errorhandler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="خطا در اتصال به اینترنت"
android:textColor="#212121" />
<Button
android:id="@+id/tryagainme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="سعی دوباره"
android:textColor="@color/colorPrimary" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fadeScrollbars="true"
android:layoutDirection="rtl"
android:scrollbars="vertical"
tools:context=".MainActivity"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layoutDirection="rtl"
app:headerLayout="@layout/navigation_header"
app:itemIconTint="@color/nav_item_icon_tint_color"
app:itemTextColor="@color/nav_item_text_color"
app:menu="@menu/navigation_menu" />
</android.support.v4.widget.DrawerLayout>
感谢帮助。
您需要调用“recyclerView.setNestedScrollingEnabled(false)
”
原因是因为NestedScrollView
在接收到来自recyclerview的滚动事件时没有调用AppBarLayout.Behavourclass。也就是说,当在 recyclerview 中发生滚动时,recyclerview dispatches/passes 滚动进度为 NestedScrollView
。 NestedScrollView
接收到滚动事件但不对其执行任何操作。
嵌套滚动视图内部 class
@Override
public void onNestedpreScroll(View target,int dx, int dy, int[] consumed){
//Do nothing
}
为了克服这个问题并在滚动 recyclerview 时制作 appbarlayout expand/collapse,只需创建一个扩展 NestedScrollView 的自定义 class 并覆盖上述方法和调用方法 dispatchNestedPreScroll()
通知 appbarlayout滚动事件并使其响应。
public class CustomNestedScrollView extends NestedScrollView{
public CustomNestedScrollView(Context context) {
super(context);
}
public CustomNestedScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void onNestedPreScroll(View target, int dx, int dy, int[] consumed){
dispatchNestedPreScroll(dx,dy,consumed,null);
}
}
然后在你的 layout.xml
中使用这个 class
<com.my.package.CustomNestedScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
/*
CONTENT
*/
</LinearLayout>
我在 NestedScrollView 中的 RecyclerView 中滚动时遇到一些问题,旁边是 CollapsingToolbarLayout。
问题是 RecyclerView 不滚动并且 CollapsingToolbarLayout 不 Expand/Collapse。
这是 XML:
<android.support.v4.widget.DrawerLayout 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:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"
tools:context=".MainActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/rootLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="256dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="12dp"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleTextAppearance="@color/trans"
app:layout_scrollFlags="scroll|enterAlwaysCollapsed">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/header" />
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/header_basij" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</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:fadeScrollbars="true"
android:fillViewport="true"
android:scrollbarDefaultDelayBeforeFade="1000"
android:scrollbarFadeDuration="2000"
android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:id="@+id/containerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<pl.droidsonroids.gif.GifImageView
android:id="@+id/pbar"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:background="@color/trans"
android:src="@drawable/loader"
/>
<LinearLayout
android:id="@+id/interneterror"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="vertical"
android:visibility="visible">
<TextView
android:id="@+id/errorhandler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="خطا در اتصال به اینترنت"
android:textColor="#212121" />
<Button
android:id="@+id/tryagainme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="سعی دوباره"
android:textColor="@color/colorPrimary" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fadeScrollbars="true"
android:layoutDirection="rtl"
android:scrollbars="vertical"
tools:context=".MainActivity"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layoutDirection="rtl"
app:headerLayout="@layout/navigation_header"
app:itemIconTint="@color/nav_item_icon_tint_color"
app:itemTextColor="@color/nav_item_text_color"
app:menu="@menu/navigation_menu" />
</android.support.v4.widget.DrawerLayout>
感谢帮助。
您需要调用“recyclerView.setNestedScrollingEnabled(false)
”
原因是因为NestedScrollView
在接收到来自recyclerview的滚动事件时没有调用AppBarLayout.Behavourclass。也就是说,当在 recyclerview 中发生滚动时,recyclerview dispatches/passes 滚动进度为 NestedScrollView
。 NestedScrollView
接收到滚动事件但不对其执行任何操作。
嵌套滚动视图内部 class
@Override
public void onNestedpreScroll(View target,int dx, int dy, int[] consumed){
//Do nothing
}
为了克服这个问题并在滚动 recyclerview 时制作 appbarlayout expand/collapse,只需创建一个扩展 NestedScrollView 的自定义 class 并覆盖上述方法和调用方法 dispatchNestedPreScroll()
通知 appbarlayout滚动事件并使其响应。
public class CustomNestedScrollView extends NestedScrollView{
public CustomNestedScrollView(Context context) {
super(context);
}
public CustomNestedScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void onNestedPreScroll(View target, int dx, int dy, int[] consumed){
dispatchNestedPreScroll(dx,dy,consumed,null);
}
}
然后在你的 layout.xml
中使用这个 class<com.my.package.CustomNestedScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
/*
CONTENT
*/
</LinearLayout>