Recyclerview 滚动在嵌套滚动视图中的片段中不起作用
Posted
技术标签:
【中文标题】Recyclerview 滚动在嵌套滚动视图中的片段中不起作用【英文标题】:Recyclerview scrolling doesn't work in fragment that in nested scroll view 【发布时间】:2019-03-23 08:02:22 【问题描述】:首先:我之前使用回收器视图和滚动监听器工作,一切都很棒,但这是第一次使用协调器布局并在嵌套滚动视图中使用片段,所以我认为问题与设计有关
这是我对滚动代码的总结
categoryRecyclerView?.addOnScrollListener(object : RecyclerView.OnScrollListener()
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int)
super.onScrolled(recyclerView, dx, dy)
Log.e("scrolling","scroll")
if (dy > 0)
Log.e("scrolling","vertical")
所以当我滚动时,我在 logcat 中没有看到 ("scrolling","vertical") 但无论我是否滚动,我都只看到一次 ("scrolling","scroll")
这是我的活动 xml
<?xml version="1.0" encoding="utf-8"?>
<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_
android:layout_
android:background="@color/layoutBackground">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_
android:layout_
android:orientation="vertical"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_
android:layout_
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/nestedScroll"
android:layout_
android:layout_
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<FrameLayout
android:padding="8dp"
android:id="@+id/fragmentContainer"
android:layout_
android:layout_ />
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottomNavigationView"
android:layout_
android:layout_
android:layout_gravity="bottom"
android:background="@color/colorPrimary"
android:padding="8dp"
app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
app:itemIconTint="@drawable/navigation_item_selector"
app:itemTextColor="@android:color/white"
app:menu="@menu/navigation_menu" />
</android.support.design.widget.CoordinatorLayout>
这是我的片段 xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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:layout_
android:layout_
android:background="@color/layoutBackground"
tools:context=".fragments.AllItemsFragment">
<android.support.v7.widget.RecyclerView
android:id="@+id/categoryRecyclerView"
android:layout_
android:layout_
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/entertainment_recycler_view_item" />
<ProgressBar
android:id="@+id/loadingCategoryList"
style="?android:attr/progressBarStyle"
android:layout_
android:layout_
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
在我设置的片段中的 onActivtyCreated 中
scrollView.isNestedScrollingEnabled = false
在初始化 recyclerview 代码中,我将 recyclerview 设置为
categoryRecyclerView?.isNestedScrollingEnabled = false
categoryRecyclerView?.setHasFixedSize(false);
【问题讨论】:
你想通过将 recyclerview 放在 scrollview 中来达到什么目的? 我删除了滚动视图但忘记了编辑 【参考方案1】:设置
categoryRecyclerView?.isNestedScrollingEnabled = true
并且不要使用recyclerview.addOnScrollListener(),而是使用nestedScrollView.setOnScrollChangeListener()。
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener()
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX,
int oldScrollY)
LinearLayoutManager layoutManager = (LinearLayoutManager) questionRecyclerView.getLayoutManager();
if (layoutManager != null)
int visibleItemCount = layoutManager.getChildCount();
int totalItemCount = layoutManager.getItemCount();
int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
if (!questionAdapter.isLoading())
if (visibleItemCount +firstVisibleItemPosition >= totalItemCount
&& firstVisibleItemPosition >= 0
&& totalItemCount >= PAGE_SIZE)
// loadMore();
);
【讨论】:
以上是关于Recyclerview 滚动在嵌套滚动视图中的片段中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
嵌套滚动视图内的 Recyclerview 滚动,但不像普通 Recyclerview 或嵌套滚动视图那样快速滚动
RecyclerView - 如何平滑滚动到嵌套滚动视图内某个位置的项目顶部?
嵌套的scrollview + recyclerview,奇怪的自动滚动行为[重复]