NestedScrollView+RecyclerView 滑动卡顿简单解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NestedScrollView+RecyclerView 滑动卡顿简单解决方案相关的知识,希望对你有一定的参考价值。

参考技术A

以下xml是当前布局:
<code>
<android.support.v4.widget.NestedScrollView
xmlns:android=" http://schemas.android.com/apk/res/android "
android:layout_
android:layout_

<LinearLayout
android:id="@+id/linerLayout"
android:layout_
android:layout_
android:orientation="vertical"


<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_
android:layout_
/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</code>

NestedScrollView中包含了LinearLayout,LinearLayout包含了一系列的组件,其中包括RecyclerView,RecyclerView和NestedScrollView都有滚动事件,这种情况下进行滑动操作,fling的操作体验很差,几乎就是手指离开的时候,滑动停止.

以下xml是改动后的布局:
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_ android:layout_ android:nestedScrollingEnabled="false" />
android:nestedScrollingEnabled="false"
官方文档:
Enable or disable nested scrolling for this view.
If this property is set to true the view will be permitted to initiate nested scrolling operations with a compatible parent view in the current hierarchy. If this view does not implement nested scrolling this will have no effect. Disabling nested scrolling while a nested scroll is in progress has the effect of stopping the nested scroll.
这里设置为false,放弃自己的滑动,交给外部的NestedScrollView处理,就没有出现卡顿的现象了,并且有fling的效果

从 NestedScrollView 中删除 OnScrollChangeListener

【中文标题】从 NestedScrollView 中删除 OnScrollChangeListener【英文标题】:Remove OnScrollChangeListener from NestedScrollView 【发布时间】:2021-05-15 13:31:38 【问题描述】:

我有一个NestedScrollView,我正在使用以下方法观察它的滚动事件:

val scrollListener = NestedScrollView.OnScrollChangeListener  _, _, scrollY, _, _ ->
    Log.d(TAG, "scrollListener: Scrolled! $scrollY")
    setNavBarVisibilityFor(offset = scrollY)

scrollView.setOnScrollChangeListener(scrollListener)

但是,根据异步事件,我可能需要也可能不需要在该滚动侦听器中调用另一个方法。在 80% 的情况下,我不需要额外的调用,所以我不想在每次触发滚动侦听器时添加一个 bool 来检查,并据此决定方法调用。

我正在尝试从我的NestedScrollView 中删除附加的滚动侦听器并创建并附加一个新侦听器:

val extraScrollListener = NestedScrollView.OnScrollChangeListener  _, _, scrollY, _, _ ->
    Log.d(TAG, "extraScrollListener: Scrolled! $scrollY")
    setNavBarVisibilityFor(offset = scrollY)
    anotherMethodThatNeedsToBeRun(offset = scrollY)

//TODO: Remove the original scrollListener from the scrollView
scrollView.setOnScrollChangeListener(extraScrollListener)

如何在附加新的之前从我的滚动视图中删除原来的NestedScrollView.OnScrollChangeListener

【问题讨论】:

您是否尝试设置 null 以摆脱 OnScrollChangeListener?这适用于由“set....”分配的其他几个侦听器 感谢您的评论!事实证明,即使调用scrollView.setOnScrollChangeListener(extraScrollListener) 也会用新的滚动侦听器替换旧的滚动侦听器,或者@BömachtBlau 建议的null。我昨天可能太累了,没有意识到我的 Log 语句来自哪里。 【参考方案1】:

在 Kotlin 中,您会遇到歧义错误。所以,在那种情况下你需要使用这行代码:

mScrollView.setOnScrollChangeListener(null as NestedScrollView.OnScrollChangeListener?)

【讨论】:

以上是关于NestedScrollView+RecyclerView 滑动卡顿简单解决方案的主要内容,如果未能解决你的问题,请参考以下文章

NestedScrollView内部的RecyclerView ViewHolder创建

NestedScrollView 修复 NestedScrollView 内部的视图顶部

recycler

当在nestedscrollview的recyclerview中将项目拖出可见空间时-nestedscrollView不滚动

有关NestedScrollView的问题

检查 NestedScrollView 是不是可滚动