RecyclerView 优化—滑动性能提升

简介: RecyclerView 优化—滑动性能提升

Android 应用程序中实现 RecyclerView 时,有时我们会遇到这样的问题:RecyclerView 项目滚动不顺畅。这会导致糟糕的用户体验,因为我们的 Android 应用程序似乎很滞后。

让我们看看我们可以做些什么来提高 RecyclerView 的性能,从而获得平滑的滚动。

RecyclerView 优化技巧

使用图像加载库

由于垃圾回收(GC)运行在主线程上,UI无响应的原因之一是内存的不断分配和释放,导致GC运行非常频繁。通过使用位图池的概念,我们可以避免它。

最好的部分是像 Glide、Fresco 这样的 Image-Loading 库使用了这个位图池概念。因此,请始终使用图像加载库。

将所有与图像相关的任务委托给这些库。

如果想知道 Glide、Fresco如何工作的可以留言获取视频资源;

设置图像宽度和高度

如果我们的图像宽度和高度是动态的(不是固定的),并且我们imageUrl从服务器获取。

如果我们事先没有设置正确的图像宽度和高度,UI 会在加载(下载图像)和设置图像到 ImageView 的过渡过程中闪烁(实际上是在下载完成时使其可见)。

所以,我们应该要求我们的后端开发者发送图像大小或纵横比,据此,我们可以计算出所需的 ImageView 的宽度和高度。

然后,我们将只能先设置宽度和高度。因此没有闪烁。问题解决了!

少做 onBindViewHolder 方法


我们的 onBindViewHolder 方法应该做的工作很少。我们应该检查我们的 onBindViewHolder 方法并对其进行优化。通过这样做,我们可以看到 RecyclerView 的改进。

使用通知项目 RecyclerView API

每当我们有删除、更新、添加项目的用例时,使用通知项目 API。

adapter.notifyItemRemoved(position)
adapter.notifyItemChanged(position)
adapter.notifyItemInserted(position)
adapter.notifyItemRangeInserted(start, end)

另外,检查DiffUtil。

万一我们被迫使用notifyDataSetChanged()基于我们的用例,我们可以尝试setHasStableIds(true).

adapter.setHasStableIds(true)

它指示数据集中的每个项目是否可以用 Long 类型的唯一标识符表示。

即使我们调用notifyDataSetChanged(),它也不必处理整个适配器的完全重新排序,因为它可以找到某个位置的项目是否与以前相同并且做更少的工作。

避免嵌套视图

如果可能,我们应该避免嵌套视图,并尽可能创建平面视图。嵌套会降低 RecyclerView 的性能。平面视图提高了性能。

使用 setHasFixedSize

如果所有项目的高度相等,我们应该使用这种方法。添加以下内容并检查性能。

recyclerView.setHasFixedSize(true)

使用 setRecycledViewPool 优化嵌套 RecyclerView

众所周知,RecyclerView 尽可能地遵循“Reuse View Using Pool”的原则。

检查 RecyclerView 如何在内部工作?

如果我们有嵌套 RecyclerView 的用例。

- OuterRecyclerView
    - InnerRecyclerViewOne
    - InnerRecyclerViewTwo

但默认情况下,优化适用于特定的 RecyclerView,因为特定的 RecyclerView 有自己的视图池。


池不会在具有相同视图类型的两个 RecyclerView 之间共享。

所以,我们可以做的是,我们可以创建一个 ViewPool 并将其传递给所有内部的 RecyclerViews,以便它像下面这样共享:

classOuterRecyclerViewAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    // code removed for brevity
    private val viewPool = RecyclerView.RecycledViewPool()
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        // code removed for brevity
        viewHolderOne.innerRecyclerViewOne.setRecycledViewPool(viewPool)
        // code removed for brevity
        viewHolderTwo.innerRecyclerViewTwo.setRecycledViewPool(viewPool)
    }
    // code removed for brevity
}

这将提高滚动性能,因为它将开始重用共享 ViewPool 中的视图。

使用 setItemViewCacheSize

我们可以通过设置 ItemView Cache Size来进行实验。

recyclerView.setItemViewCacheSize(cacheSize)

根据官方文档:它设置在将它们添加到可能共享的回收视图池之前要保留的屏幕外视图的数量。屏幕外视图缓存保持对附加适配器中的更改的感知,允许 LayoutManager 重用这些未修改的视图,而无需返回到适配器重新绑定它们。

这意味着当我们滚动 RecyclerView 以使视图几乎完全脱离屏幕时,RecyclerView 将保留它,以便我们可以将其滚动回视图而无需onBindViewHolder()再次调用。

一般来说,我们不会改变 View Cache 的大小,而是尝试一下,如果它适合你,就实现它。

相关文章
|
设计模式 存储 安全
八种创建单例模式的方式-懒汉式与饿汉式及枚举
八种创建单例模式的方式-懒汉式与饿汉式及枚举
584 2
|
11月前
|
运维 Kubernetes API
集群一多,规矩就得写成代码:聊聊 OPA / Gatekeeper / Kyverno 在多集群里的真实用法
集群一多,规矩就得写成代码:聊聊 OPA / Gatekeeper / Kyverno 在多集群里的真实用法
463 0
|
C++ Windows
解决win10无法更新问题,错误码0x80070422
Windows系统更新时出现错误代码0x80070422,通常因Windows Update服务未启动或相关服务异常。解决方法包括:启动Windows Update服务、关闭网络地址转换、使用第三方工具如DirectX Repair增强版一键修复、运行系统文件检查工具(sfc /scannow)或安装Windows修复专家,全面修复DLL缺失、系统文件损坏等问题,适用于多种Windows系统版本。
1848 7
|
前端开发 JavaScript
什么是深拷贝;深拷贝和浅拷贝有什么区别;深拷贝和浅拷贝有哪些方法(详解)
浅拷贝适用于只复制对象的第一层属性,且这些属性不是引用类型。深拷贝适用于需要完全独立的副本,包括对象和数组的嵌套结构。选择哪种拷贝方式取决于你的具体需求和场景。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 Java Android开发
uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
3267 0
uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
|
存储 搜索推荐 安全
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(一)
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(一)
1194 0
|
前端开发 JavaScript 安全
Android MVI 架构:从双向绑定到单向数据流
现在从事Android开发多少都要懂点架构知识,从MVC、MVP再到MVVM,想必大家对于其各自的优缺点早已如数家珍。今天介绍的MVI与MVVM非常接近,可以针对性地弥补MVVM中的一些缺陷
3410 0
|
缓存 Android开发 开发者
Android RecycleView 深度解析与面试题梳理
本文详细介绍了Android开发中高效且功能强大的`RecyclerView`,包括其架构概览、工作流程及滑动优化机制,并解析了常见的面试题。通过理解`RecyclerView`的核心组件及其优化技巧,帮助开发者提升应用性能并应对技术面试。
801 8
|
JSON JavaScript 前端开发
借助Python神器,快速get上市公司财务数据
借助Python神器,快速get上市公司财务数据
2721 0
|
机器学习/深度学习 人工智能 编解码
原来Stable Diffusion是这样工作的
初中生都能听懂的Stable Diffusion的工作原理,看完还不会你来找我
原来Stable Diffusion是这样工作的

热门文章

最新文章