RecyclerView嵌套RecyclerView的滑动问题如何解

2023-11-18

一、概述

虽然今天我们要说的是Rv嵌套Rv的问题,但多数情况下我们都不会使用Rv嵌套Rv,来实现复杂的列表,而是使用多ItemType实现,可能再复杂点的,配合GridLayoutManager.SpanSizeLookup一起来实现,再高级点的自定义LayoutManager实现。
Rv嵌套Rv会有问题,如果嵌套的Rv高度没有设置明确的值,会一次创建所有的item,造成卡顿。类似我们在NestedScrollView里面嵌套Rv,Rv的高度写的是wrap_content或match_parent,一样的情况。
既然高度不确定,那我们给嵌套的Rv指定高度,不就不会一次创建所有item了吗,可真要是这么做,你就会发现嵌套的Rv无法滑动,只能滑动外部的父Rv。
疑惑为啥在NestedScrollView里面嵌套的Rv指定高度后,Rv是能正常滑动的呢?不用奇怪,NestedScrollView之所以叫这个名字,是因为他本身是支持嵌套滑动的。

我们一般不会使用Rv嵌套Rv,但并不是我们不用就不会出现。
有时你可能遇到一个很老的代码,他就是这么实现的,并且还出现了卡顿问题,需要优化。如果你完全改变实现方式使用多ItemType,那改动肯定会很大。在时间不充裕且不能出新bug的情况下,限制子Rv的高度,应该是最好的办法,只要解决子Rv滑动问题。
或者有时,UI出的某个页面,就必须通过Rv嵌套Rv实现,就像这样:
在这里插入图片描述
那我们有办法让子Rv正常滑动吗?办法肯定有:

  • 一种是像NestedScrollView,通过嵌套滑动机制;
  • 另一种是基于传统的事件分发机制,请求父Rv不要拦截事件;

下面我们通过第2种方式实现。

二、实现思路

很明显事件被父Rv全部拦截了,所以子Rv不能滑动。我们的思路是,监听事件,如果手指触摸的是子Rv,并且子Rv能滑动,就告诉父Rv不要拦截事件,由子Rv处理。
思路有了,有几点需要考虑如何实现:

  • 如何监听事件?很容易,通过TouchListener即可。
  • 在哪里监听?直接给子Rv设置OnTouchListener 还是 给父Rv 添加 OnItemTouchListener?可能两个地方都可以,需要去试。我已经试过了,答案是给父Rv 添加 OnItemTouchListener。给子Rv设置setOnTouchListener,似乎可以。但实现后发现子Rv时而可以滑动,时而不可以滑动,可能父Rv优先收到事件,还是会直接拦截事件,压根走不到子Rv的onTouch里面。通过给父Rv设置OnItemTouchListener 能保证item始终能收到点击事件,OnItemTouchListener 对事件的处理优先于父Rv。
  • 如何获取手指触摸位置的子Rv?通过父Rv.findChildViewUnder(x, y) 可以拿到触摸位置的 view,再通过父Rv.getChildViewHolder(view)拿到viewHolder,拿到viewHolder便拿到子Rv了。
  • 如何判断子Rv能不能滑动?通过子Rv.canScrollVertically(1) 方法判断能否向上滑动,返回true能; 通过子Rv.canScrollVertically(-1) 方法判断能否向下滑动,返回true能;
  • 如何告诉父Rv不要拦截事件?通过子Rv.requestDisallowInterceptTouchEvent(true)。

三、核心代码

上面思路是我们的核心,其他的都是类似套路,Adapter,点击事件等等。下面是核心代码,相关注释很明确。

rv.addOnItemTouchListener(object : RecyclerView.SimpleOnItemTouchListener() {
    var viewHolder: ParentViewHolder? = null
    var mY = 0f
    override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
        when (e.action) {
            MotionEvent.ACTION_DOWN -> {
                rv.findChildViewUnder(e.x, e.y)?.let {//找到手指点击的itemView
                    val vh = rv.getChildViewHolder(it)//获取点击的viewHolder
                    (vh as? ParentViewHolder)?.let { parentVh ->
                        val childRv = parentVh.childRv
                        val isVisible = childRv.visibility == View.VISIBLE//是否可见
                        val canUpScroll = childRv.canScrollVertically(1)//能否向上滑动
                        val canDownScroll = childRv.canScrollVertically(-1)//能否向下滑动
                        if (isVisible && (canUpScroll || canDownScroll)) {//可见,并且能滑动,请求父Rv不拦截事件
                            viewHolder?.childRv?.requestDisallowInterceptTouchEvent(true)
                            viewHolder = vh
                            mY = e.y
                        }
                    }
                }
            }
            MotionEvent.ACTION_MOVE -> {
                val childRv = viewHolder?.childRv ?: return false//item里面的Rv
                val diff = mY - e.y
                mY = e.y
                if (diff >= 0) {//手指向上滑动
                    //RecyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部
                    if (childRv.canScrollVertically(1)) {//子Rv未滑到底部,请求父Rv不拦截事件
                        childRv.requestDisallowInterceptTouchEvent(true)
                    } else {//子Rv滑到底部了,父Rv可以拦截事件
                        childRv.requestDisallowInterceptTouchEvent(false)
                    }
                } else {//手指向下滑动
                    //RecyclerView.canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部
                    if (childRv.canScrollVertically(-1)) {//子Rv未滑到顶部,请求父Rv不拦截事件
                        childRv.requestDisallowInterceptTouchEvent(true)
                    } else {//子Rv滑到顶部了,父Rv可以拦截事件
                        childRv.requestDisallowInterceptTouchEvent(false)
                    }
                }
            }
            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                viewHolder?.childRv?.requestDisallowInterceptTouchEvent(false)
                mY = 0f
                viewHolder = null
            }
        }
        return false
    }
})

四、完整代码

RvNestedRvActivity

class RvNestedRvActivity : AppCompatActivity(), IActionListener {
    val adapter = ParentAdapter(this)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_nested)
        supportActionBar?.title = "RvNestedRv"
        val rv = findViewById<RecyclerView>(R.id.recyclerView)
        rv.layoutManager = LinearLayoutManager(this)
        rv.adapter = adapter
        rv.setHasFixedSize(true)

        val list = ArrayList<ParentBean>()
        for (i in 0..90) {
            val parentBean = ParentBean()
            parentBean.name = "Parent $i"
            val childList = ArrayList<ChildBean>()
            for (jj in 0..50) {
                val childBean = ChildBean()
                childBean.name = "Child i$i-$jj"
                childList.add(childBean)
            }
            parentBean.childList = childList
            list.add(parentBean)
        }
        adapter.list.addAll(list)
        rv.addOnItemTouchListener(object : RecyclerView.SimpleOnItemTouchListener() {
            var viewHolder: ParentViewHolder? = null
            var mY = 0f
            override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
                when (e.action) {
                    MotionEvent.ACTION_DOWN -> {
                        rv.findChildViewUnder(e.x, e.y)?.let {//找到手指点击的itemView
                            val vh = rv.getChildViewHolder(it)//获取点击的viewHolder
                            (vh as? ParentViewHolder)?.let { parentVh ->
                                val childRv = parentVh.childRv
                                val isVisible = childRv.visibility == View.VISIBLE//是否可见
                                val canUpScroll = childRv.canScrollVertically(1)//能否向上滑动
                                val canDownScroll = childRv.canScrollVertically(-1)//能否向下滑动
                                if (isVisible && (canUpScroll || canDownScroll)) {//可见,并且能滑动,请求父Rv不拦截事件
                                    viewHolder?.childRv?.requestDisallowInterceptTouchEvent(true)
                                    viewHolder = vh
                                    mY = e.y
                                }
                            }
                        }
                    }
                    MotionEvent.ACTION_MOVE -> {
                        val childRv = viewHolder?.childRv ?: return false//item里面的Rv
                        val diff = mY - e.y
                        mY = e.y
                        if (diff >= 0) {//手指向上滑动
                            //RecyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部
                            if (childRv.canScrollVertically(1)) {//子Rv未滑到底部,请求父Rv不拦截事件
                                childRv.requestDisallowInterceptTouchEvent(true)
                            } else {//子Rv滑到底部了,父Rv可以拦截事件
                                childRv.requestDisallowInterceptTouchEvent(false)
                            }
                        } else {//手指向下滑动
                            //RecyclerView.canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部
                            if (childRv.canScrollVertically(-1)) {//子Rv未滑到顶部,请求父Rv不拦截事件
                                childRv.requestDisallowInterceptTouchEvent(true)
                            } else {//子Rv滑到顶部了,父Rv可以拦截事件
                                childRv.requestDisallowInterceptTouchEvent(false)
                            }
                        }
                    }
                    MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                        viewHolder?.childRv?.requestDisallowInterceptTouchEvent(false)
                        mY = 0f
                        viewHolder = null
                    }
                }
                return false
            }
        })
    }

    override fun onParentClick(position: Int, bean: ParentBean) {
        //展开状态,点击折叠;折叠状态,点击展开
        bean.isExpand = !bean.isExpand
        //刷新item
        adapter.notifyItemChanged(position)
    }

    override fun onChildClick(position: Int, bean: ChildBean) {
        Toast.makeText(this, bean.name, Toast.LENGTH_SHORT).show()
    }
}

IActionListener

interface IActionListener {
    fun onParentClick(position: Int, bean: ParentBean)
    fun onChildClick(position: Int, bean: ChildBean)
}

ParentAdapter

class ParentAdapter(private val listener: IActionListener?) : RecyclerView.Adapter<ParentViewHolder>() {
    val list = ArrayList<ParentBean>()
    //子Rv用的缓存池
    private val recyclerPool = RecyclerView.RecycledViewPool()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ParentViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.nested_rv_parent_item, parent, false)
        return ParentViewHolder(view, listener)
    }

    override fun onBindViewHolder(holder: ParentViewHolder, position: Int) {
        holder.onBind(list[position])
        //让子Rv共用同一个缓存池
        holder.childRv.setRecycledViewPool(recyclerPool)
    }

    override fun getItemCount() = list.size
}

ParentBean

class ParentBean {
    var childList: ArrayList<ChildBean>? = null
    var name: String? = null
    var isExpand = false
}

ParentViewHolder

class ParentViewHolder(view: View, private val listener: IActionListener?) :
    RecyclerView.ViewHolder(view), View.OnClickListener {
    val childRv: RecyclerView = view.findViewById<RecyclerView>(R.id.childRv).apply {
        setHasFixedSize(true)
        layoutManager = GridLayoutManager(context, 4).apply {
            spanSizeLookup
        }
    }
    private val textTv = view.findViewById<TextView>(R.id.text)
    private val imageIv = view.findViewById<ImageView>(R.id.image)

    fun onBind(bean: ParentBean) {
        textTv.text = bean.name
        imageIv.rotation = if (bean.isExpand) 180f else 0f
        val childList = bean.childList
        if (bean.isExpand && childList != null) {//展开状态,显示子Rv
            childRv.visibility = View.VISIBLE
            var adapter = childRv.adapter
            if (adapter is ChildAdapter) {
                adapter.list.clear()
                adapter.list.addAll(childList)
                adapter.notifyDataSetChanged()
            } else {
                adapter = ChildAdapter(listener).apply {
                    list.addAll(childList)
                }
                childRv.adapter = adapter
            }
        } else {//折叠状态,隐藏子Rv
            childRv.visibility = View.GONE
        }
        textTv.setOnClickListener(this)
        itemView.tag = bean
    }

    override fun onClick(v: View?) {
        val bean = itemView.tag as? ParentBean ?: return
        when (v?.id) {
            R.id.text -> {
                listener?.onParentClick(adapterPosition, bean)
            }
        }
    }
}

ChildAdapter

class ChildAdapter(private val listener: IActionListener?) : RecyclerView.Adapter<ChildViewHolder>() {

    val list = ArrayList<ChildBean>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChildViewHolder {
        Log.i("TAG", "ChildAdapter onCreateViewHolder viewType $viewType")
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.nested_rv_child_item, parent, false)
        return ChildViewHolder(view,listener)
    }

    override fun onBindViewHolder(holder: ChildViewHolder, position: Int) {
        Log.i("TAG", "ChildAdapter onBindViewHolder position $position")
        holder.onBind(list[position])
    }

    override fun getItemCount(): Int {
        return list.size
    }
}

ChildBean

class ChildBean {
    var name: String? = null
}

ChildViewHolder

class ChildViewHolder(view: View, private val listener: IActionListener?) :
    RecyclerView.ViewHolder(view),
    View.OnClickListener {
    private val textTv = view.findViewById<TextView>(R.id.textView)
    fun onBind(bean: ChildBean) {
        textTv.text = bean.name
        textTv.setOnClickListener(this)
        itemView.tag = bean
    }

    override fun onClick(v: View?) {
        val bean = itemView.tag as? ChildBean ?: return
        when (v?.id) {
            R.id.textView -> {
                listener?.onChildClick(adapterPosition, bean)
            }
        }
    }
}

五、不足

  • 不能实现子Rv滑动完之后,父Rv接着滑动
  • 某些情况下(快速滑动),父Rv还是会优先滑动,尽管触摸的是子Rv

这些不足可能是传统的事件分发机制无法解决的,要避免这些问题,需要使用嵌套滑动机制实现,后面我会基于这种方式实现。

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

RecyclerView嵌套RecyclerView的滑动问题如何解 的相关文章

  • Android TextView 更改文本大小后不调整大小

    我有一个ListView对该行进行一些自定义布局 一张图像 然后使用两个TextView在垂直方向上LinearLayout 参见下面的代码 我的问题是 当我动态更改文本大小时 在getView的方法Adapter 文字大小确实改变了 但是
  • 在PC上的Firefox上模拟Android的Webview?

    作为我的软件开发工作 针对 Android 的一部分 我需要在通过 Android 的 WebView 查看时检查大量 HTML 页面的内容 到目前为止 我已经能够通过将 HTML 内容转储到文件中来实现这一点 data data
  • 如何设置带有选项卡的多个滑动视图的默认选项卡?

    我真的被困住了 我在主要活动中使用选项卡进行了四个滑动视图 但我想要的是当用户打开应用程序时 它会自动显示第二个选项卡而不是第一个选项卡 这是我的 MainActivity java public class MainActivity ex
  • 如何从 TextInputLayout 中删除底部填充

    第一张图就是我想要的 第二张图是我实现的 正如您所看到的 TextInputLayout 的底部有一个填充 这使得灰色背景溢出超过 edittext 行 请不要建议负边距或填充 因为它在较新的 API 中不起作用 这是我为第一个文本输入布局
  • GCM 卷曲操作超时

    我的服务器上存储了几个负责 GCM 操作的 php 文件 它们似乎在需要时工作得很好 但它们经常返回一个错误 指出 卷曲错误 操作在 0 毫秒后超时 0 中的 0 收到的字节数 这是服务器的问题还是我的 GCM 代码的问题 下面是我的 ph
  • Android TV 上不会出现通知

    我正在 Android TV 上玩通知 不过 我无法在屏幕上显示通知 我正在使用 Android 6 0 上的 Nexus 播放器 当我在手机上运行此代码时 会出现通知 但在电视上 不会出现通知 我错过了什么吗 Override publi
  • 如何将图像调整为原始大小

    Android s imageView has a serious flaw it makes my image into a square frame with the rest as white space How can I fix
  • 如何使用分页库在回收器视图中添加日期分隔符?

    经过大量搜索 我知道使用常规适配器是可能的 但我不知道如何使用分页库来做到这一点 我不需要代码 只是一个线索 Example 要添加分隔符 您基本上有两个选择 基于视图 您显式地将分隔符作为 项目 包含在列表中 并为这些分隔符定义新的视图类
  • RecyclerView 的弹跳效果

    我想在RecyclerView 每当我过度滚动内容时就会出现反弹效果 是否有一个库或示例 我也找不到任何支持 RecyclerView 弹跳效果的库 最终我自己实现了一个新的库 查看我的图书馆过度滚动弹力 android https git
  • adb 可以检测的设备数量是否有上限

    我想知道 android adb 工具可以检测的设备数量是否有最大限制 我在谷歌上没有找到任何答案 我已经成功连接了 13 台设备 但我不知道它是否仍然适用于更多设备 Thanks 似乎没有 adb 限制 但有一个 USB 控制器限制 具体
  • 在 LibGDX 中保存和检索图像文件

    如何在 LibGDX 中保存和检索图像文件 我想将图像文件保存在 AndroidApplication 类的本地存储中 并在我的 Core 项目中检索它 Libgdx 中的文件处理在libGDX 维基 https github com li
  • 为什么我的 android 项目中 onStart() 方法在 onCreate 之前运行?

    根据 Activity 的生命周期 onCreate 在应用创建时会被调用一次 然后 onStart 方法在整个 Activity 生命周期中可能会被调用多次 然而这并不是发生在我身上的事情 我的 onCreate 方法中有以下代码 mRe
  • 解析 JSONException:JSONArray 文本必须以字符 1 处的 '[' 开头

    我正在尝试将 Android 应用程序与本地 MySQL 数据库连接 但遇到问题 解析 JSON 数组 我在这里阅读了所有类似的问题 但没有任何作用 错误消息 Error parsing data org json JSONExceptio
  • 在 Android 中移动目录的最快方法?

    在 Android 中移动目录最快的方法是什么 在大多数情况下 但并非所有情况 源和目标位于同一 SD 卡文件系统上 目前 我的代码遍历整个目录结构 并将每个文件的内容复制到新位置的同名新文件中 然后它会验证文件大小是否匹配 然后删除源文件
  • 找不到 R.layout.activity_main

    我试图使用一些在线教程来解决多种布局 问题是只要只有一个 XML 文件 我的程序就可以正确构建和编译 当我添加多个 XML 文件时 我收到错误消息 指出该行的 activity main 无法解析或不是字段 setContentView R
  • ClassCastException:ApiVersionImpl 无法转换为 java.lang.Integer

    我有 android gradle 项目 当我尝试启动应用程序时出现以下异常 ClassCastException com android build gradle internal model ApiVersionImpl cannot
  • 从绝对路径获取名称,从最后一个斜杠获取子字符串,java android

    我想提取绝对路径的名称 如果我有一个值为 mnt sdcard Videos Videoname 的字符串 我想保存一个值为 Videoname 的字符串 字符串正在变化 我之前无法获取斜杠的数量 如何从最后一个斜杠中分割子字符串 mnt
  • android studio 错误:缺少功能:WATCH

    我尝试在我的智能手表上使用 android studio 运行一个简单的应用程序 并收到以下消息 我的智能手表运行 Android 4 4 2 其 API 级别为 19 我尝试过但没有帮助的事情 将最低 SDK 版本更改为 API 19 r
  • NDK 对静态库中函数的未定义引用

    因此 我尝试在 Android 应用程序的本机代码上使用 libopus 我的 Android mk 文件如下所示 PLATFORM PREFIX opt android ext LOCAL PATH PLATFORM PREFIX lib
  • android 中的 onSensorChanged 在模拟器中不断触发

    我正在使用 ACCELEROMETER 传感器 并已通过相同的方式注册了一个侦听器 mSensorManager SensorManager getSystemService Context SENSOR SERVICE mAccelera

随机推荐

  • 示波器探头碰人的波形,人碰示波器探头的波形

    如上图所示 如图中 点说明电流恒定 导体切割磁场线 向导线方向切割磁场变强 远离导线切割磁场变弱 则图中 点说明导体不动 但是导线电流增大则磁场强度增加 等效成导体往恒定电流磁场切割 导线电流减小则磁场减小 等效成导体往恒定电流磁场反方向切
  • 「 标准 」NTSC、PAL、SECAM 三大制式简介

    NTSC National Televison System Committee 制式 NTSC 电视标准 每秒 29 97 帧 简化为 30 帧 电视扫描线为 525 线 偶场在前 奇场在后 标准的数字化 NTSC 电视标准分辨率为720
  • KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎

    来源 阿里巴巴云原生公众号 美国西部时间 2020 年 11 月 18 日 在云原生技术 最高盛宴 的 KubeCon 北美峰会 2020 上 CNCF 应用交付领域小组 CNCF SIG App Delivery 与 Open Appli
  • 信号处理——梅尔滤波器(MFCC)

    信号处理 梅尔滤波器 MFCC 一 概述 在语音识别 Speech Recognition 和话者识别 Speaker Recognition 方面 最常用到的语音特征就是梅尔倒谱系数 Mel scale FrequencyCepstral
  • NoSQL系统的分类

    什么是NoSQL系统 采用最终一致性的数据库系统 统称为NoSQL Not only SQL 系统 根据数据模型的不同 NoSQL系统又分为以下几类 基于键值对的 Memcached Redis 基于列存储的 Bigtable Apache
  • 小米路由器3/3G/4通过串口(ttl)刷机

    准备工作 淘宝购买 USB转TTL CH340模块 杜邦线 排针 https detail tmall com item htm id 525204252260 spm a1z09 2 0 0 19dc2e8doubZVx u blagqs
  • 查看linux下安装了哪些软件

    1 查看是否安装了gcc 命令 rpm ql gcc rpm qa grep gcc 参数 q 询问 a 查询全部 l 显示列表 2 权限 安装和删除只有root和有安装权限的用户才可以进行 查询是每个用户都可以进行操作的 RPM 的介绍和
  • 《Docker 镜像操作》

    Docker 镜像原理 1 Docker 镜像本质是什么 是一个分层文件系统 2 Docker 中一个 centos 镜像为什么只有 200MB 而一个 centos 操作系统的 iso 文件要几个个 G Centos 的 iso 镜像文件
  • IDEA插件-PlantUML

    一 idea安装plantUml插件 在idea中Preferences gt plugins gt Browse repositories gt 搜索 plantUML gt 安装即可 二 通过 brew 安装 Graphviz 安装pl
  • [极客大挑战 2019]RCE ME(取反、异或绕过正则表达式、bypass disable_function)

    题目进去后 很简单的代码 显然命令执行 看到了eval 应该是用system等函数来实现命令执行 但是得要先绕过preg match 中正则表达式的限制 一开始傻乎乎的直接传了个数组 妄图绕过preg match 这很显然是不行的 附上大佬
  • c语言 push,深入了解C语言(局部变量的定义)

    深入了解C语言 这一节我们主要来研究一下C语言如何使用函数中的局部变量的 C语言中对于全局变量和局部变量所分配的空间地址是不一样的 全局变量是放在 DATA段 也就是除开 TEXT代码段的另一块集中的内存空间 而局部变量主要是使用堆栈的内存
  • Java 9:装B之前你必须要会的——泛型,注解,反射

    1 泛型 1 1 基本概念 泛型提供了编译期的类型检查 但问题远非这么简单 原生态类型 List list1 new ArrayList 规避的类型检查 List list1 new ArrayList
  • 【mcuclub】PH酸碱度检测传感器-PH4502C

    一 实物图 型号 PH4502C 二 原理图 编号 名称 功能 1 VCC 供电电压正极 5V 2 GND 供电电压负极 3 GND 模拟信号输出负极 4 PO 模拟信号输出正极 5 2V5 基准电压2 5V输出口 6 T1 温度传感器DS
  • 在 vscode 上刷力扣 Leetcode 可以这样来

    背景 神奇的算法网站 LeetCode 值得驻留 网页版似乎不太方便 作为习惯于在编译器上敲代码的你 如何 vscode 上优雅的刷力扣 Leetcode 在本地配置 记录下来方便备查 环境前置 电脑具备 NodeJs环境 第一步 安装插件
  • 模型优化-RMSprop

    RMSprop 全称 root mean square prop 算法 和动量方法一样都可以加快梯度下降速度 关于动量方法的内容可以参考这篇博文模型优化 动量方法 动量方法借助前一时刻的动量 从而能够有效地缓解山谷震荡以及鞍部停滞问题 而
  • linux云主机如何运维建站最简单-办法来了

    对于企业和个人站长来说 云服务器运维管理是一件比较棘手的问题 如果企业没有专业的运维工程师 那么就会使用一些工具来帮助运维 毕竟通过shh命令操作linux服务器的还是少数 那么运维服务器这件事就要用到一个工具linux面板 每个人对于云服
  • EXCEL VBA从入门到精通 第一章:VBA入门

    第一章 VBA入门 第一节 什么是VBA 介绍VBA的定义 作用和优点 VBA Visual Basic for Applications 是一种编程语言 是微软Office套件中的一个重要组成部分 主要用于自动化处理Office中的各种操
  • Xilinx平台SRIO介绍(二)SRIO IP核基础知识

    使用SRIO IP核必须掌握的基础知识 理解了这篇 剩下的只是代码罢了 汇总篇 Xilinx平台SRIO介绍 汇总篇 目录 前言 SRIO RapidIO GT 有什么关系
  • 基于python进行小波分析,频率谱分析

    该方法基于python进行时间序列的小波分析并出图 包括功率谱图和小波分解后的图 默认的小波为morlet小波 该代码由 Evgeniya Predybaylo 博士提供 https github com chris torrence wa
  • RecyclerView嵌套RecyclerView的滑动问题如何解

    一 概述 虽然今天我们要说的是Rv嵌套Rv的问题 但多数情况下我们都不会使用Rv嵌套Rv 来实现复杂的列表 而是使用多ItemType实现 可能再复杂点的 配合GridLayoutManager SpanSizeLookup一起来实现 再高