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 的大小,而是尝试一下,如果它适合你,就实现它。

相关文章
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
542 0
|
Android开发
【错误记录】Android Studio 编译报错 ( Installed Build Tools revision 31.0.0 is corrupted )
【错误记录】Android Studio 编译报错 ( Installed Build Tools revision 31.0.0 is corrupted )
1443 0
【错误记录】Android Studio 编译报错 ( Installed Build Tools revision 31.0.0 is corrupted )
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
226 7
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
1310 9
|
开发工具 git
Merge还是Rebase?这次终于懂了
Merge还是Rebase?这次终于懂了
3671 3
|
缓存 Android开发 开发者
Android RecycleView 深度解析与面试题梳理
本文详细介绍了Android开发中高效且功能强大的`RecyclerView`,包括其架构概览、工作流程及滑动优化机制,并解析了常见的面试题。通过理解`RecyclerView`的核心组件及其优化技巧,帮助开发者提升应用性能并应对技术面试。
587 8
|
Shell Android开发
安卓scheme_url调端:在AndroidManifest.xml 中如何配置 Intent-filter?
为了使Android应用响应vivo和oppo浏览器的Deep Link或自定义scheme调用,需在`AndroidManifest.xml`中配置`intent-filter`。定义启动的Activity及其支持的scheme和host,并确保Activity可由外部应用启动。示例展示了如何配置HTTP/HTTPS及自定义scheme,以及如何通过浏览器和adb命令进行测试,确保配置正确无误。
|
JSON Android开发 数据格式
Android 打开系统文件管理器,并返回选中文件的路径
Android 打开系统文件管理器,并返回选中文件的路径
1085 0
|
存储 搜索推荐 安全
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(一)
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(一)
911 0
|
运维 监控 数据可视化
自动化运维:使用Python脚本进行日志分析
【8月更文挑战第31天】当系统出现问题时,我们通常会查看日志寻找线索。然而,手动阅读大量日志既费时又易出错。本文将介绍如何使用Python脚本自动分析日志,快速定位问题,提高运维效率。我们将从简单的日志读取开始,逐步深入到复杂的正则表达式匹配和错误统计,最后实现一个自动化的日志监控系统。无论你是新手还是老手,这篇文章都将为你提供有价值的参考。让我们一起探索如何用代码解放双手,让运维工作变得更加轻松吧!
1200 0

热门文章

最新文章