当前位置: 首页 > news >正文

掌握 Android 中的 RecyclerView 优化

掌握 Android 中的 RecyclerView 优化

  • 一、RecyclerView Pool以及何时使用它
  • 二、onCreateViewHolder 和 onBindViewHolder
  • 三、优化 RecyclerView 的不同方法
  • 四、视图无效与请求布局
  • 五、ViewHolder模式
  • 六、默认的废料和脏视图类型
  • 七、结论

RecyclerView 是 Android 中一个功能强大的小部件,用于高效显示大型列表或数据网格。为了确保应用程序的性能和响应能力,优化 RecyclerView 实现至关重要。这里我们将探讨各种技术和概念,帮助充分利用 RecyclerView。

一、RecyclerView Pool以及何时使用它

RecyclerView Pool 是一种帮助管理 RecyclerView 中视图的内存和性能的机制。它本质上是一个缓存,用于保存当前在屏幕上不可见但在不久的将来可能再次需要的视图。这显着减少了每次新项目进入可见区域时膨胀新视图的开销。

何时使用 RecyclerView Pool:

  • 处理大型列表或数据网格时使用它。
  • 当列表中的项目具有不同的视图类型时,请选择 RecyclerView Pool。

二、onCreateViewHolder 和 onBindViewHolder

在RecyclerView中,onCreateViewHolder和onBindViewHolder是适配器中必不可少的方法。它们共同为列表中的每个项目创建和绑定视图。

  • onCreateViewHolder在需要创建新视图时被调用。它负责扩展布局并创建 ViewHolder 实例。
  • 当现有视图被新项目重用时,将调用onBindViewHolder 。它将数据绑定到视图持有者,允许您更新视图的内容。
  • onBindViewHolder不应该用于绑定点击侦听器,我们应该注意我们在其中执行的匿名对象或任务。仔细阅读下面的代码,然后我会解释为什么?
class  MyAdapter ( private  val items: List<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { inside  class  ViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView) { init { itemView.setOnClickListener { // 处理项目click here val position = adapterPosition if (position != RecyclerView.NO_POSITION) { val clickedItem = items[position] // 处理 clickedItem 的点击事件} } } } override  fun  onCreateViewHolder (parent: ViewGroup , viewType: Int ) : ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, Parent, false ) return ViewHolder(view) } override  fun  onBindViewHolder (holder: ViewHolder ,position: Int ) { val currentItem = items[position] / / 此处将数据绑定到视图持有者} override  fun  getItemCount () = items.size 
}
  • 在onBindViewHolder中,为每个项目单独生成单击侦听器,从而导致多个侦听器实例。通过将点击监听器放置在 中ViewHolder,它们在 ViewHolder 创建时就形成了,由于 ViewHolder 的可重用性,提高了内存效率。

三、优化 RecyclerView 的不同方法

  1. 使用图像库:

处理图像时,建议使用提供位图池的图像库。这可以防止过多的内存使用和频繁的垃圾收集。

Glide.with( this ) .load(imageUrl) .placeholder(R.drawable.placeholder_image) .error(R.drawable.error_icon) .into(imageView)
  1. 优化图像尺寸:从服务器获取图像尺寸和宽高比,以避免不必要的调整大小和缩放。
  2. setHasStableIds:此方法应用于setHasStableIds(true)启用稳定的项目 ID。这有助于有效地更新和重新排序项目,而无需不必要的重新绑定。
class  MyAdapter ( private  val itemList: List<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { init { setHasStableIds( true ) // 为此适配器启用稳定 ID} //....}
  1. setHasFixedSize:如果RecyclerView大小本身是固定的并且不会因其内容而改变,则使用它setHasFixedSize(true)可以通过避免不必要的布局计算来帮助提高性能。
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) 
recyclerView.setHasFixedSize( true ) // 为 RecyclerView 启用固定大小
  1. setItemViewCacheSize:使用此方法调整缓存大小,以控制保留多少个离屏视图。这可以帮助管理内存使用。
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) 
recyclerView.setItemViewCacheSize( 10 ) // 根据项目大小将视图缓存大小设置为自定义值

四、视图无效与请求布局

  • Invalidate:用于指示视图的内容已更改并且需要重新绘制。
  • requestLayout:用于请求新的布局通道,影响视图的大小和位置。

您可能想知道为什么我突然谈论invalidate与requestLayout。让我解释。

我讨论了“无效”与“请求布局”,以说明它们如何影响视图的生命周期。这会影响屏幕重绘时间,过多的布局和绘制阶段会降低性能。要优化 Android 页面,尤其是 RecyclerView,彻底掌握视图生命周期至关重要。

让我用一个例子来进一步解释一下:

当 TextView 的 wrap_content 与 100dp 固定时,将或应该调用什么(invalidate 或 requestLayout)?

回答:

当 TextView 的宽度设置为 时wrap_content,调用requestLayout()会更合适。这是因为这requestLayout()表明视图层次结构需要重新测量和布局,以确保内容正确地适合边界。

当 TextView 的宽度固定时(例如,设置为特定值,如100dp),调用invalidate()通常就足够了。它通知系统视图的内容已更改,并且需要在现有布局范围内重新绘制。这可以避免在更新视图外观时进行不必要的重新布局计算。

五、ViewHolder模式

ViewHolder 模式是一种设计模式,它通过最大限度地减少对 .recyclerview 的调用次数来增强 recyclerview 的性能findViewById()。它涉及创建一个 ViewHolder 类,该类保存对项目布局中视图的引用。这允许在用户滚动列表时有效地重用视图。有关 ViewHolder 模式的综合示例,请查看此链接。

六、默认的废料和脏视图类型

在RecyclerView中,每种视图类型的废视图和脏视图的默认计数设置为 5。对于标题等仅 1 或 2 个剪贴视图就足够的情况,此通用编号可能不是最佳选择。废料视图是可重用的、分离的视图,可以轻松地重新附加。

为了提高内存效率,您可以根据每个特定视图类型的流行程度自定义池大小,从而定制剪贴视图行为。这种方法通过有效管理RecyclerView中不同类型项目的剪贴视图数量,确保优化内存使用。

val customRecycledViewPool = RecyclerView.RecycledViewPool().apply { setMaxRecycledViews(viewType, poolSize) // 设置自定义 viewType 和 poolSize}

七、结论

优化 RecyclerView 实施对于保持流畅且响应迅速的用户体验至关重要。通过理解 RecyclerView Pool 和 ViewHolder 模式等概念,并优化视图创建和绑定,您可以确保您的应用程序有效地处理大量数据。

请记住,每种优化技术都有特定的目的,并且应用这些技术的组合可以显着提高 RecyclerView 的性能。

相关文章:

掌握 Android 中的 RecyclerView 优化

掌握 Android 中的 RecyclerView 优化 一、RecyclerView Pool以及何时使用它二、onCreateViewHolder 和 onBindViewHolder三、优化 RecyclerView 的不同方法四、视图无效与请求布局五、ViewHolder模式六、默认的废料和脏视图类型七、结论 RecyclerView 是 Android 中一个功能强…...

Android platform tool中d8.bat不生效

d8.bat因找不到java_exe文件&#xff0c;触发EOF d8.bat中之前代码为&#xff1a; set java_exe if exist "%~dp0..\tools\lib\find_java.bat" call "%~dp0..\tools\lib\find_java.bat" if exist "%~dp0..\..\tools\lib\find_java.bat" …...

WSL安装Ubuntu22.04,以及深度学习环境的搭建

安装WSL 安装 WSL 2 之前&#xff0c;必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。 以管理员身份打开 PowerShell 并运行&#xff1a; dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart下载 Linux 内核更…...

【PTA|选择题|期末复习】结构体

2-1 For the following declarations,assignment expression_is not correct. struct Student {long num;char name[28];}st1,st2{101,"Tom"},*p&st1; 〇 A.st1 st2 ◎ B.p->name st2.name O C p->num st2.num 〇 D,*pst2 2-2 下面定义结构变量的语…...

Video generation models as world simulators-视频生成模型作为世界模拟器

原文地址&#xff1a;Video generation models as world simulators 我们探索在视频数据上进行大规模生成模型的训练。具体来说&#xff0c;我们联合训练文本条件扩散模型&#xff0c;同时处理不同持续时间、分辨率和长宽比的视频和图像。我们利用一个在视频和图像潜在编码的时…...

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感&#xff0c;严格遵循黄金分割比例的蓝色点晴线条&#xff0c;加上雾面工艺及高低起伏错落有致的线条处理&#xff0c;在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…...

nginx-------- 高性能的 Web服务端 (三) 验证模块 页面配置

一、http设置 1.1 验证模块 需要输入用户名和密码 htpasswd 此命令来自于 httpd-tools 包&#xff0c;如果没有安装 安装一下即可 也可以安装httpd 直接yum install httpd -y 也一样 第一次生成文件htpasswd -c 文件路径 姓名 交互式生成密码 htpasswd -bc 文…...

Kafka是如何防止消息丢失的

Kafka通过一系列机制来防止消息丢失&#xff0c;主要包括以下几个方面&#xff1a; 生产者端&#xff08;Producer&#xff09;保证&#xff1a; 同步发送&#xff1a;生产者默认是异步发送消息的&#xff0c;但如果希望保证消息不丢失&#xff0c;可以选择将异步发送改为同步…...

[工具探索]VSCode介绍和进阶使用

相比较GoLand、PhpStorm、PyCharm、WebStorm的重量级内存占用&#xff0c;从Windows系统来&#xff0c;各种卡死&#xff0c;换到MacOS倒不会卡死&#xff0c;但是内存占用太多&#xff0c;影响体验&#xff0c;决定换到VSCode。当然这个过程需要适应过渡期&#xff0c;旧伙计都…...

Oracle迁移到mysql-表结构的坑

1.mysql中id自增字段必须是整数类型 id BIGINT AUTO_INCREMENT not null, 2.VARCHAR2改为VARCHAR 3.NUMBER(16)改为decimal(16,0) 4.date改为datetime 5.mysql范围分区必须int格式&#xff0c;不能list类型 ERROR 1697 (HY000): VALUES value for partition …...

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这&#xff1a; 容器化部署Nacos&#xff1a;从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入&#xff0c;引入…...

使用LinkedList实现堆栈及Set集合特点、遍历方式、常见实现类

目录 一、使用LinkedList实现堆栈 堆栈 LinkedList实现堆栈 二、集合框架 三、Set集合 1.特点 2.遍历方式 3.常见实现类 HashSet LinkedHashSet TreeSet 一、使用LinkedList实现堆栈 堆栈 堆栈&#xff08;stack&#xff09;是一种常见的数据结构&#xff0c;一端…...

springboot-cache+redis 为指定名称缓存设置独立超时时间

版本 spring-boot: 3.2.2 方案 注册 RedisCacheManagerBuilderCustomizer Bean对指定名称缓存进行定制 Bean RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {return builder -> builder.withCacheConfiguration(// Cacheable 注解使用的cac…...

Flutter 数据持久化存储之Hive

Flutter 数据持久化存储之Hive 前言正文一、配置项目二、UI① 增加UI② 显示和删除UI 三、使用Hive① 初始化Hive② TypeAdapter自定义对象③ 注册TypeAdapter③ CURD 四、源码 前言 在Flutter中&#xff0c;有多种方式可以进行数据持久化存储。以下是一些常见的方式&#xff1…...

Java中继承静态属性,方法,和非静态属性和方法的继承区别

结论&#xff1a; Java中静态属性和静态方法是可以被继承的&#xff0c;但是不可以被重写&#xff0c;而是被隐藏。 Java中非静态属性&#xff0c;可以被继承&#xff0c;但是不可以被重写&#xff0c;而是被隐藏。 Java中非静态方法&#xff0c;可以被继承&#xff0c;可以…...

C# If与Switch的区别

在 switch 语句中使用表达式比较时&#xff0c;编译器会生成一个查找表&#xff0c;其中包含所有表达式的值和对应的 case 标签。因此&#xff0c;与使用常量或字面量比较相比&#xff0c;使用表达式比较可能会略微降低性能。 只有当 switch 语句中的所有 case 标签都使用常量或…...

实验室预约|实验室预约小程序|基于微信小程序的实验室预约管理系统设计与实现(源码+数据库+文档)

实验室预约小程序目录 目录 基于微信小程序的实验室预约管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;管理员登录 &#xff08;2&#xff09;实验室管理 &#xff08;3&#xff09;公告信息…...

蓝桥杯DP算法——区间DP(C++)

根据题意要求的是将石子合并的最小权值&#xff0c;我们可以根据DP思想使用二维数组f[i,j]来存放所有从第i堆石子到第j堆石子合并成一堆石子的合并方式。 然后由第二个图所示&#xff0c;我们可以将i到j区间分成两个区间&#xff0c;因为将i到j合并成一个区间的前一步一定是合…...

pytest结合Allure生成测试报告

文章目录 1.Allure配置安装2.使用基本命令报告美化1.**前置条件**2.**用例步骤****3.标题和描述****4.用例优先级**3.进阶用法allure+parametrize参数化parametrize+idsparametrize+@allure.title()4.动态化参数5.环境信息**方式一****方式二**6.用例失败截图1.Allure配置安装 …...

Linux--ACL权限管理

一.ACL权限管理简介 ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种文件权限管理机制&#xff0c;它提供了比传统的UGO&#xff08;用户、组、其他&#xff09;权限更灵活的权限设置方式。以下是ACL的一些主要功能&#xff1a; 针对特定用户或…...

ASPP模块的演进与优化:从DeepLab v2到v3+的多尺度语义分割实践

1. 多尺度语义分割的挑战与ASPP的诞生 想象一下你要给一张街景照片中的每个像素分类——哪些是道路、哪些是车辆、哪些是行人。最大的困难是什么&#xff1f;是远处的小车和近处的大卡车可能属于同一类别&#xff0c;但尺寸差异巨大。这就是语义分割中的多尺度问题&#xff0c;…...

Hunyuan-MT-7B效果展示:学术论文摘要英→中翻译在专业术语一致性表现

Hunyuan-MT-7B效果展示&#xff1a;学术论文摘要英→中翻译在专业术语一致性表现 1. 引言&#xff1a;专业翻译的技术挑战 学术论文翻译一直是机器翻译领域的难点&#xff0c;特别是专业术语的一致性保持。传统翻译工具在处理学术文献时&#xff0c;经常出现术语翻译不统一、…...

Pixel Dream Workshop 在电商领域的应用:一键生成商品场景图

Pixel Dream Workshop 在电商领域的应用&#xff1a;一键生成商品场景图 1. 电商商品图的痛点与机遇 电商行业有个公开的秘密&#xff1a;商品图片的制作成本往往比想象中高得多。我们曾合作过的一家服装电商&#xff0c;每月仅模特拍摄费用就超过20万元&#xff0c;这还不包…...

Flutter Gradle插件迁移指南:从apply script到声明式plugins的实践

1. 为什么需要迁移到声明式plugins块 最近在维护一个Flutter项目时&#xff0c;我发现每次构建Android端都会弹出一个黄色警告&#xff1a;"You are applying Flutters app_plugin_loader Gradle plugin imperatively using the apply script method..."。这个警告看…...

3个强力功能解决微信聊天记录永久保存难题的完整指南

3个强力功能解决微信聊天记录永久保存难题的完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 你…...

51单片机之按键控制RGB灯

51单片机之按键控制RGB灯描述&#xff1a;利用KEIL5编程&#xff0c;使AT89C52通过按键输入控制RGB灯显示不同颜色。硬件&#xff1a;电路仿真图&#xff08;未运行&#xff09;电路仿真图&#xff08;运行&#xff09;程序&#xff1a;主要是按键消抖&#xff0c;机械按键按下…...

从零构建CPWC超声成像仿真:Field II实战与模块化工作流解析

1. CPWC超声成像仿真入门指南 第一次接触CPWC超声成像仿真时&#xff0c;我被各种专业术语和复杂的数学公式搞得晕头转向。经过几个月的实战摸索&#xff0c;终于总结出一套小白也能快速上手的方法。CPWC&#xff08;相干平面波复合&#xff09;是近年来超声成像领域的热门技术…...

从Gridworld到吃豆人:用Python拆解强化学习三大核心算法(值迭代、策略调参、Q学习)

从Gridworld到吃豆人&#xff1a;Python实战强化学习三大核心算法 1. 强化学习基础与马尔可夫决策过程 想象一下&#xff0c;你正在训练一只小狗完成障碍赛跑。每次它正确跳过障碍&#xff0c;你会给予零食奖励&#xff1b;如果撞到障碍&#xff0c;则没有任何奖励。经过多次尝…...

你还在用StreamingResponse硬扛LLM流式?FastAPI 2.0全新AsyncIteratorResponse实践已落地金融级AI客服(限前500名获取迁移checklist)

第一章&#xff1a;FastAPI 2.0异步流式响应的核心演进与金融级落地价值FastAPI 2.0 将 StreamingResponse 的底层调度机制从 ASGI 的同步迭代器封装&#xff0c;全面升级为原生协程驱动的异步生成器&#xff08;async def ... yield&#xff09;&#xff0c;彻底消除事件循环阻…...

别光看公式了!用Multisim 14.0手把手仿真这8个经典运放电路(附工程文件)

别光看公式了&#xff01;用Multisim 14.0手把手仿真这8个经典运放电路&#xff08;附工程文件&#xff09; 在电子工程的学习过程中&#xff0c;运算放大器&#xff08;Op-Amp&#xff09;无疑是一个让人又爱又恨的存在。爱的是它强大的功能和广泛的应用&#xff0c;恨的是那些…...