如何更好的优化 ListView 控件的性能

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD,日常还会涉及Android开发工作。
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
热衷分享,喜欢原创,如果觉得博主的文章还不错的话,还请点赞、收藏哦!👍

文章目录

  • 前言 🌟
  • 优化点🪐

前言 🌟

之前给大家分享过 定制化 ListView 控件,我们以这个 demo 为参照对象,来对比优化前后的性能。

优化点🪐

  • 布局优化
    convertView 参数用于将之前加载好的布局进行缓存。
  • 控件获取优化——ViewHolder

ListView 控件说是最难用的控件,有一个缺点就是性能较差,有很多细节需要优化,比如,每次展示 ListView 子项时就会调用一次 getView() 方法

在这里插入图片描述
我们会发现在 getView() 方法的参数中,有一个 convertView 参数我们还没有使用,打印下 convertView 的值为 nul,这个参数主要是用于将之前加载好的布局进行缓存。

在这里插入图片描述
将第一次加载好的布局进行缓存,后续进行复用,是不是就可以提高性能。还有一个问题,我们将 converView 的数量打印出来,数量是13,而我们这个真机界面上展示的子视图是11,为什么还多2个呢?一般情况下为了能够正常显示足够数量的子项,ListView 会根据屏幕的高度以及每个子项的高度来计算出屏幕可见区域能够容纳的子项数量,这个数量被称为可见子项数(Visible Item Count)。

Visible Item Count = 屏幕高度 / 单个子项高度

防止每次都调用 findViewbyId() 方法,可以将控件的实例进行缓存,就需要 ViewHolder ViewHolder 的作用是持有列表项的视图组件的引用,并在适配器中进行缓存。通过在首次创建列表项时,通过 findViewById() 方法找到视图组件,并将其存储在 ViewHolder 对象中。然后,在后续调用中可以直接访问 ViewHolder 中的视图组件,而无需再次查找。

新增内部类 ViewHolder ,创建一个 ViewHolder 对象,并将控件的实例存放在 ViewHolder 里,然后调用 View 的 setTag() 方法,将 ViewHolder 对象存储在 View 中。当convertView 不为 null 的时候,则调用 View 的 getTag() 方法,把 ViewHolder 重新取出。这样所有控件的实例都缓存在了 ViewHolder 里,
就没有必要每次都通过 findViewById() 方法来获取控件实例了。

完整代码如下

class FruitAdapter (activity: Activity,val resourceId: Int,data:List<Fruit>):ArrayAdapter<Fruit>(activity,resourceId,data) {inner class ViewHolder(val fruitImage:ImageView,val fruitName:TextView)//private var i = 0override fun getView(position: Int,convertView: View?,parent:ViewGroup):View{//Log.i("getView被调用","次数 ${i++}")//Log.i("converView"," $convertView")val view:Viewval viewHolder:ViewHolderif (convertView == null) {view = LayoutInflater.from(context).inflate(resourceId, parent, false)//Log.i("第一次加载布局"," $view")val fruitImage:ImageView = view.findViewById(R.id.fruitImage)val fruitName:TextView = view.findViewById(R.id.fruitName)viewHolder = ViewHolder(fruitImage,fruitName)view.tag = viewHolder}else{view = convertView//Log.i("后续加载布局"," $view")viewHolder = view.tag as ViewHolder}val fruit = getItem(position) //获取当前项的Fruit实例if(fruit != null){viewHolder.fruitImage.setImageResource(fruit.imageId)viewHolder.fruitName.text = fruit.name}return  view}
}

我们来对比优化前后的内存占用情况
优化前:
在这里插入图片描述优化后:
在这里插入图片描述
优化前后内存相差14MB,优化效果还是非常明显的。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB教程(四):mongoDB索引

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

windows查看局域网所有设备ip

windows如何查看局域网所有设备ip 操作方法 一 . 在搜索栏里输入cmd 二 .在命令行黑窗口输入arp -a 三 . 最上面显示的动态地址就是所有设备ip

Redis:高性能的开源缓存数据库

简介&#xff1a; Redis&#xff08;Remote Dictionary Server&#xff09;是一个基于内存的开源缓存数据库&#xff0c;常用于缓存、消息队列、分布式锁等场景。它被设计成快速、可靠且易于使用的数据库系统&#xff0c;具有高性能、高可用、可扩展性等特点。本篇博客将介绍Re…

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题&#xff1a; ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭&#xff0c;但是苹果这个默认开启&#xff0c;而且大部分客户也不会去自己关闭。 2、欺骗苹果手机&#xff0c;代码实现。 先说解决思路&#xf…

80. UE5 RPG 实现UI显示技能冷却进度功能

在上一篇文章里&#xff0c;我们实现了通过GE给技能增加资源消耗和技能冷却功能。UI也能够显示角色能够使用的技能的UI&#xff0c;现在还有一个问题&#xff0c;我们希望在技能释放进去冷却时&#xff0c;技能变成灰色&#xff0c;并在技能冷却完成&#xff0c;技能可以再次使…

Spring Boot 框架知识汇总

1、什么是SpringBoot&#xff1f; 通过Spring Boot&#xff0c;可以轻松地创建独立的&#xff0c;基于生产级别的Spring的应用程序&#xff0c;您可以“运行"它们。大多数Spring Boot应用程序需要最少的Spring配置&#xff0c;集成了大量常用的第三方库配置&#xff0c;使…

React有哪些应用场景

React 是一个由 Facebook 开发并广泛使用的 JavaScript 库&#xff0c;专门用于构建用户界面。由于其灵活性和强大的生态系统&#xff0c;React 被广泛应用于多种场景。以下是一些 React 的主要应用场景&#xff1a; 1. 单页面应用&#xff08;SPA&#xff09; React 的组件化…

在Anaconda环境中安装TensorFlow+启动jupyter notebook

1.打开cmd&#xff0c;输入C:\Users\xy>conda create -n tensorflow python3.7 这是在环境中创建了一个名为tensorflow的环境&#xff0c;具体会显示以下信息&#xff1a; C:\Users\xy>conda create -n tensorflow python3.7 Retrieving notices: ...working... done Co…

springboot把 EXCEL 文件以流的形式返回给前端

1.controller层 GetMapping(ReviewUrls.API_DOWNLOAD_REVIEW_RESULT)public Response<Void> downloadReviewResult(HttpServletResponse response) {resultService.downloadReviewResult(response);return Response.ok();}2.service层 public void downloadReviewResult(…

海豚调度器执行impla工作流成功但没跑出数据原因和解决方案

在海豚调度器(DolphinScheduler)中执行Impala离线脚本时出现执行状态成功但实际上未产出数据&#xff0c;之后重跑又能成功的情况&#xff0c;可能是由多种因素引起的。下面是一些可能的原因及对应的解决方案&#xff1a; 可能原因及解决方案 资源限制或并发冲突 原因&#x…

Python实战Elasticsearch的核心技巧详解

概要 Elasticsearch 是一个分布式的搜索引擎,可以用于全文搜索、结构化搜索、分析等多种场景。它基于Lucene构建,提供了强大的搜索功能和数据分析能力。本文将详细介绍如何使用Python实现与Elasticsearch的交互,包括安装、配置、基本操作和实际应用示例。 安装和配置 安装…

centos单机配置多个内网IP地址

centos单机配置多个内网IP地址 引配置1. 查看当前网络IP配置2. 打开网络配置目录3. 设置静态IP4. 编辑ifcfg-eno1:15. 重启网络配置 引 同一个局域网&#xff0c;但是对接的多个子系统使用了不同的网段&#xff0c;如一个系统主机IP地址是192.168.10.1&#xff0c;另一个系统主…

基于B站视频评论的文本分析,采用包括文本聚类分析、LDA主题分析、网络语义分析

研究主题 本研究旨在通过对B站视频评论数据进行文本分析&#xff0c;揭示用户评论的主题、情感倾向和语义结构&#xff0c;助力商业决策。主要技术手段包括Python爬虫、LDA主题分析、聚类分析和语义网络分析。首先&#xff0c;利用Python爬虫采集大量评论数据并进行预处理。运…

license系统模型设计使用django models

User (用户)License (许可证)Product (产品)LicenseAssignment (许可证分配) 简单的模型定义&#xff1a; from django.db import models from django.contrib.auth.models import Userclass Product(models.Model):name models.CharField(max_length255)description model…

npm发布的包如何快速在cnpm上使用

npm发布的包如何快速在cnpm上使用 解决方案 前往淘宝npm镜像官网 搜索插件库并点击同步 等待一分钟即可查看最新版本

linux进程周边知识——内核对硬件的管理——计算机世界的管理

前言&#xff1a;本节主要讲解内核也就是操作系统对于硬件的管理&#xff0c; 本节内容同样为进程的周边知识。 主要是关于软件方面&#xff0c; 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章&#xff0c; 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但…

小程序创建与项目初始化(构建 npm + 集成 Sass)

一、打开微信开发者工具 确认 左侧导航栏是否选中的 小程序点击 【】创建小程序 二、创建小程序 三、初始化 清空 app.wxss、app.js 去掉 rendererOptions 和 componentFramework 不需要最新的搜索引擎 留下以下文件 四、自定义构建 npm 集成 Sass 首先 先把小程序源…

Go 高效Web开发框架 Echo

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

QT获得本地IP以及MAC地址

getIPSttring():连接的ip以及端口号来返回本地的ip地址 getMacString() : 通过本地的ip地址获得该IP地址关联的网络接口的MAC地址 QString getIpString(QString ip, QString port) {QTcpSocket socket;int t_port port.toInt();socket.connectToHost(ip, t_port);if (socket…

WEB前端01-HTML5基础(01)

一.WEB相关概念 软件架构 C/S: Client/Server &#xff08;客户端/服务器端&#xff09;&#xff1a;在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序 优点&#xff1a;用户体验好 缺点&#xff1a;开发、安装&#xff0c;部署&#xff0c;维护麻烦 B/S: Br…