NestedScrollView使用和理解

2023-11-08

https://www.jianshu.com/p/fda06c916d6b
一、前言:

NestedScrollView支持嵌套滑动的 ScrollView

因此,我们可以简单的把 NestedScrollView 类比为 ScrollView,其作用就是作为控件父布局,从而具备(嵌套)滑动功能。

NestedScrollViewScrollView 的区别就在于 NestedScrollView 支持 嵌套滑动,无论是作为父控件还是子控件,嵌套滑动都支持,且默认开启。

因此,在一些需要支持嵌套滑动的情景中,比如一个 ScrollView 内部包裹一个 RecyclerView,那么就会产生滑动冲突,这个问题就需要你自己去解决。而如果使用 NestedScrollView 包裹 RecyclerView,嵌套滑动天然支持,你无需做什么就可以实现前面想要实现的功能了。

举个例子:

我们通常为RecyclerView增加一个 Header 和 Footer 的方法是通过定义不同的 viewType来区分的,而如果使用 NestedScrollView,我们完全可以把RecyclerView当成一个单独的控件,然后在其上面增加一个控件作为 Header,在其下面增加一个控件作为 Footer。

具体布局如下所示:

 

<?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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"
        android:orientation="vertical">

        <!-- This is the Header -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="#888888"
            android:gravity="center"
            android:text="Header"
            android:textColor="#0000FF"
            android:textSize="30sp" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <!-- This is the Footer -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="#888888"
            android:gravity="center"
            android:text="Footer"
            android:textColor="#FF0000"
            android:textSize="30sp" />

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

注: NestedScrollViewScrollView 一样,内部只能容纳一个子控件。

效果如下所示:

 

aaaa.gif

ps: 虽然 NestedScrollView 内嵌RecyclerView和其他控件可以实现 Header 和 Footer,但还是不推荐上面这种做法(建议还是直接使用RecyclerView自己添加 Header 和 Footer),因为虽然 NestedScrollView 支持嵌套滑动,但是在实际应用中,嵌套滑动可能会带来其他的一些奇奇怪怪的副作用,Google 也推荐我们能不使用嵌套滑动就尽量不要使用。

如果想知道 NestedScrollView 嵌套其他控件可能带来的问题,可以查看:NestedScrollView、RecycleView、ViewPager 等布局方面的常见问题汇总,及解决

二、 嵌套滑动机制 简析

我们知道,Android 的事件分发机制中,只要有一个控件消费了事件,其他控件就没办法再接收到这个事件了。因此,当有嵌套滑动场景时,我们都需要自己手动解决事件冲突。而在 Android 5.0 Lollipop 之后,Google 官方通过 嵌套滑动机制 解决了传统 Android 事件分发无法共享事件这个问题。

嵌套滑动机制 的基本原理可以认为是事件共享,即当子控件接收到滑动事件,准备要滑动时,会先通知父控件(startNestedScroll);然后在滑动之前,会先询问父控件是否要滑动(dispatchNestedPreScroll);如果父控件响应该事件进行了滑动,那么就会通知子控件它具体消耗了多少滑动距离;然后交由子控件处理剩余的滑动距离;最后子控件滑动结束后,如果滑动距离还有剩余,就会再问一下父控件是否需要在继续滑动剩下的距离(dispatchNestedScroll)...

上面其实就是 嵌套滑动机制 的工作原理,那么如果想让我们自定义的View或者ViewGroup实现嵌套滑动功能,应该怎样做呢?

其实,在 Android 5.0 之后,系统自带的ViewViewGroup都增加了 嵌套滑动机制 相关的方法了(但是默认不会被调用,因此默认不具备嵌套滑动功能),所以如果在 Android 5.0 及之后的平台上,自定义View只要覆写相应的 嵌套滑动机制 相关方法即可;但是为了提供低版本兼容性,Google 官方还提供了两个接口,分别作为 嵌套滑动机制 父控件接口和子控件接口:

前面我们说过 NestedScrollView 无论是作为父控件还是子控件都支持嵌套滑动,就是因为它同时实现了 NestedScrollingParentNestedScrollingChild。文档如下所示:

图片.png

三、注意:

  • NestedScrollView主要用于非列表(除ListView和RecyclerView)间的滑动比较好;
  • NestedScrollView嵌套RecyclerView会导致复用失效,看了很多网友的帖子,一直没有很好的解决方案;
  • 如果RecyclerView数据量很少,可以复用的;
  • 建议给RecyclerView添加头部和尾部的方式,弃用NestedScrollView;

查看详细分析:https://www.jianshu.com/p/f55abc60a879

参考



作者:因为我的心
链接:https://www.jianshu.com/p/fda06c916d6b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NestedScrollView使用和理解 的相关文章

  • 大疆云台和华为P30_超全,一篇文章搞清楚大疆Osmo三款产品区别!

    超全 一篇文章搞清楚大疆Osmo三款产品区别 2020 06 06 17 23 07 33点赞 179收藏 13评论 先说结论吧 Mobile 3适合日常用手机作为主力拍摄工具的人群 手机的拍摄能力以及符合你对画面的要求 另外你还可以接受每
  • code runner 中文使用指南

    Code Runner 用法 运行代码 使用快捷键 Ctrl Alt N 按F1然后选择 键入 Run Code 右键单击文本编辑器 然后在编辑器上下文菜单中单击 Run Code 命令 单击编辑器标题菜单中的 Run Code 按钮 单击
  • 车载毫米波雷达信号处理中的模糊问题仿真分析

    车载毫米波雷达信号处理中的模糊问题仿真分析 概述 车载毫米波雷达在现代汽车领域中扮演着重要的角色 用于实现自动驾驶 智能巡航控制和碰撞警报等功能 然而 在车载毫米波雷达信号处理中 存在各种模糊问题 这些问题可能会影响雷达系统的性能和准确性
  • MySQL数据库之DCL命令

    一 DCL命令 GRANT 授予访问权限 REVOKE 撤销访问权限 COMMIT 提交事务处理 ROLLBACK 事务处理回退 SAVEPOINT 设置保存点 LOCK 对数据库的特定部分进行锁定 查看用户权限 SHOW GRANTS F
  • vue学习笔记(三)

    1 vue开发存在SEO问题 前端开发采用vue开发后是单页面 单页面里面 前后端分离 渲染过程是js写的 在js调用接口返回数据之前 页面已经被打开了 实际上就是空白页面 这个时候右键点击查看源代码 实际上是都看不到内容的 对SEO不太有
  • 什么是节点光端机?总线型光端机有哪些优势?

    节点式光端机又称总线型光端机 其准确的定义是采用单 双纤链路式组网形式的图像传输系统 也被称为链路式光端机 那么 节点式光端机具体是什么呢 总线型光端机又有哪些优势呢 接下来我们就跟随飞畅科技的小编一起来详细了解下吧 什么是节点光端机 节点
  • Android动画+自定义Dialog实现闲鱼发布页面动态效果

    先来看一下效果图 一 新建一个项目DialogView 在layout文件夹下创建一个anmi的文件夹用于存放动画资源 1 首先创建进入Dialog和关闭Dialog时候的主题背景动画 进入Dialog时的动画 main go in xml
  • Ubuntu18 安装ssh

    1 安装ssh 在终端输入命令 sudo apt get install openssh server 2 查看SSH服务是否启动 输入命令 sudo ps e grep ssh
  • LRU算法

    http blog csdn net Ackarlix article details 1759793 http www cnblogs com changweihua archive 2012 05 13 2497903 html 文章一
  • STM32中栈、堆、全局区、常量区、代码区、RAM、ROM的分析

    STM32中栈 堆 全局区 常量区 代码区 RAM ROM的分析 1 堆 栈区 STM32中堆栈是为了存储不同信息而开辟的空间 具体对应于启动文件中的head和stack所定义的内存空间 STM32中 堆向高地址增长 栈向低地址增长 堆 是
  • 探索学习Qt

    探索学习Qt 版本说明 版本 作者 日期 备注 0 2 loon 2018 10 26 新增部分说明内容及总结计划 目录 文章目录 探索学习Qt 版本说明 目录 一 目的 二 Qt是什么 三 Qt示例和教程 1 探索Qt creator 2
  • 安装依赖时报错:npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving

    F study heima vueCode demo3 gt npm i axios S npm ERR code ERESOLVE npm ERR ERESOLVE could not resolve npm ERR npm ERR Wh
  • VR丨有哪些靠谱的VR开发工具之引擎篇

    转载 http www uisdc com vr tools design engine C7210 靠谱的工具都有哪些 在不同的学习阶段又该怎样进行合理的选择 本文将聚焦于这两个问题向你介绍一系列主流设计开发工具 包括引擎 3D建模 2D
  • CEEMDAN算法及其应用

    目录 前言 一 CEEMDAN 算法 1 算法原理 2 MATLAB程序 二 CEEMDAN 算法的应用 1 CEEMDAN 小波阈值联合去噪 2 CEEMDAN 小波包分析降噪 3 CEEMDAN 时频峰值滤波 结束语 参考文献 前言 针
  • [计算机网络] 计算机网络基础总结

    计算机网络 计算机网络基础总结 文章目录 计算机网络 计算机网络基础总结 一 计算机网络体系结构 1 TCP IP的体系结构 2 OSI的体系结构 二 TCP协议 三 UDP协议 1 特点 2 报文段格式 四 HTTP协议 五 Socket
  • js打开新窗口设置窗口大小

    javascript g OpenWindow url jsp 800 600 function g OpenWindow pageURL innerWidth innerHeight var ScreenWidth screen avai
  • 【随机过程】19 - 随机过程的线性预测问题

    随机过程的线性预测问题 文章目录 随机过程的线性预测问题 1 随机过程的估计问题概述 1 1 预测问题 1 2 内插问题 1 3 滤波问题 2 随机过程的可预测性 2 1 新息过程 2 1 1 信息过程的定义 2 1 2 估计的子空间分解
  • Stable-Diffusion-WebUI 搭建使用教程

    Stable Diffusion Webui 是一个基于Gradio库的Stable Diffusion的浏览器界面 可以说是AI绘画集合体 支持目前主流的开源AI绘画模型 例如 NovelAi Stable Diffusion 有了它 我
  • cassandra 可视化工具

    cassandramanager razorsql presto devcenter
  • Qt出现错误 “undefined reference to `vtable for XXXXX.XXX”

    使用QT的继承类的时候本来很正常 但是添加了 Q OBJECT之后却发现出现了一大堆vtable告警 终于找到下面的解决方法了 重新qmake 如果新建一个类 继承了某个类 在这个类的头文件中式没有 Q OBJECT宏声明的 如果想使用si

随机推荐