RecyclerView 中 ViewHolder

ViewHolder 是 RecyclerView 架构中的核心组件,它作为视图持有者和复用单元,在列表性能和内存优化中扮演着至关重要的角色。

一、ViewHolder 的本质与作用

1. 核心定义

public abstract static class ViewHolder {public final View itemView;  // 持有的列表项视图int mPosition = NO_POSITION; // 当前数据位置int mItemViewType = INVALID_TYPE; // 视图类型// ...
}
  • 视图容器:持有 item 布局的所有视图引用

  • 数据载体:连接数据和视图的桥梁

  • 复用单元:作为 RecyclerView 缓存机制的基本单位

2. 核心价值

图表

代码

二、ViewHolder 的生命周期详解

1. 完整生命周期流程

2. 关键方法解析

方法调用时机典型用途
onCreateViewHolder()创建新视图时初始化视图组件
onBindViewHolder()绑定数据时更新视图内容
onViewAttachedToWindow()视图进入屏幕启动动画/加载
onViewDetachedFromWindow()视图离开屏幕停止动画/释放
onViewRecycled()进入回收池释放临时资源

三、ViewHolder 的实现模式

1. 基础实现(Java)

public class MyViewHolder extends RecyclerView.ViewHolder {TextView title;ImageView icon;public MyViewHolder(View itemView) {super(itemView);title = itemView.findViewById(R.id.tv_title);icon = itemView.findViewById(R.id.iv_icon);}public void bind(DataItem item) {title.setText(item.getTitle());Glide.with(itemView).load(item.getImageUrl()).into(icon);}
}

2. 最佳实践(Kotlin + ViewBinding)

class MyViewHolder(private val binding: ItemLayoutBinding
) : RecyclerView.ViewHolder(binding.root) {fun bind(item: DataItem) {binding.apply {tvTitle.text = item.titleGlide.with(root).load(item.imageUrl).into(ivIcon)// 点击事件处理root.setOnClickListener { // 通过接口回调}}}
}// Adapter中使用
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {val binding = ItemLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)return MyViewHolder(binding)
}

四、ViewHolder 与性能优化

1. 视图查找优化

// 传统方式(每次绑定都查找 - 不推荐)
void onBindViewHolder(ViewHolder holder, int position) {TextView title = holder.itemView.findViewById(R.id.tv_title);title.setText(data.get(position).title);
}// ViewHolder模式(只查找一次)
class ViewHolder {TextView title; // 初始化时查找void bind(DataItem item) {title.setText(item.title); // 直接使用}
}

2. 内存优化技巧

override fun onViewRecycled(holder: MyViewHolder) {// 释放图片资源Glide.with(holder.binding.ivIcon).clear()// 取消异步任务holder.currentTask?.cancel()// 重置视图状态holder.binding.progressBar.visibility = View.GONE
}

3. 视图类型优化

@Override
public int getItemViewType(int position) {DataItem item = dataList.get(position);if (item.hasImage()) return TYPE_IMAGE;if (item.isFeatured()) return TYPE_FEATURED;return TYPE_DEFAULT;
}// 创建不同ViewHolder
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {switch (viewType) {case TYPE_IMAGE:return new ImageViewHolder(...);case TYPE_FEATURED:return new FeaturedViewHolder(...);default:return new DefaultViewHolder(...);}
}

五、ViewHolder 的事件处理

1. 点击事件实现

class MyViewHolder(private val binding: ItemLayoutBinding,private val onClick: (Int) -> Unit
) : RecyclerView.ViewHolder(binding.root) {init {binding.root.setOnClickListener {val pos = adapterPositionif (pos != RecyclerView.NO_POSITION) {onClick(pos)}}}
}// Adapter中
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {return MyViewHolder(binding) { position ->// 处理点击事件val item = dataList[position]showDetail(item)}
}

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

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

相关文章

06.【数据结构-C语言】队列(先进先出,队列实现:入队列、出队列、获取队头or队尾元素,队列实现代码,队列相关题目)

目录 1. 队列的概念及结构 2. 队列的实现(链表) 2.1 队列的实现方式 2.2 队列结构体声明 2.3 初始化&销毁 2.4 入队列(尾插) 2.5 出队列(头删) 2.6 取队头&取队尾 2.7 判空 2.8 获取队列…

学习Java的Day28

今天在昨天完成的留言板项目基础上,我进一步开发了一个酒店房型管理系统。该系统采用MVC架构,主要功能是对酒店房型信息进行增删改查操作。数据库设计方面,我创建了hotel_room_type表,包含以下字段:id:主键…

动态路由菜单:根据用户角色动态生成菜单栏的实践(包含子菜单)

前言在现代后台管理系统中,不同角色的用户通常需要访问不同的功能模块。动态路由菜单技术正是解决这一需求的关键方案。本文将介绍如何基于用户角色实现动态菜单路由,让每个用户登录后只能看到自己权限范围内的菜单项。核心思路实现动态路由菜单的核心流…

【DP】篮球运动

题目描述小明建造了一个篮球场,他请来了2行n列的人,想让他们进行比赛。每一个人都有一个能力值,第一行分别为h11,h12,…,h1n,第二行为h21,h22,…,h2n。现在小…

202506 电子学会青少年等级考试机器人六级器人理论真题

更多内容和历年真题请查看网站:【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 六级】 网站链接 青少年软件编程历年真题模拟题实时更新 2025年6月 青少年等级考试机器人理论真题六级 第 1 题 在windows系统下,下列选项中&#xff0c…

MWFMRf2StdAlnCalClient.dll MWFMReceiverClient.dll MWFMPNACalDataClient.dll MWFMNFClient.dll MWFM

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

Ruoyi-Vue-Plus 修改包名、模块名、项目名

效果对比 修改包名 选中需要修改的包名,右键选择重命名(快捷键:ShiftfnF6) 选择所有目录 选择重构 重构软件包耗时较长,请耐心等待!如果需要快速修改多模块中的多级包名,可以参考:…

GPT OSS 双模型上线,百度百舸全面支持快速部署

GPT OSS 是 OpenAI 推出的重量级开放模型,专为强推理能力、智能体任务及多样化开发场景设计,标志着大模型在开放性与实用性上的重要突破。该系列包含两款高性能模型:参数规模为 117B 的 GPT‑OSS‑120B 和 21B 的 GPT‑OSS‑20B。二者皆采用 …

Godot ------ 通过鼠标对节点进行操作

Godot ------ 通过鼠标对节点进行操作 引言 正文 引言 对于一个游戏,通过鼠标对游戏对象进行操作是非常普遍的行为,本文我们将以 Control 节点进行举例,说明如何通过鼠标对 Control 节点进行移动操作。 正文 首先,我们创建一个 Contorl 节点,并将它的 Layout->Trans…

C++虚函数表实现机制以及用C语言对其进行的模拟实现(加入了自己的思考和笔记)

文章目录前言C对象的内存布局没有虚函数的对象拥有仅一个虚函数的类对象拥有多个虚函数的类对象单继承且本身不存在虚函数的继承类的内存布局本身不存在虚函数(不严谨)但存在基类虚函数覆盖的单继承类的内存布局定义了基类没有的虚函数的单继承的类对象布局多继承且存在虚函数覆…

OpenAI GPT-5 深度解析:API Key定价与ChatGPT(Free, Plus, Pro)用户的区别

前言:两年等待,只为这一跃 在科技圈长达两年的屏息期待与无尽猜想之后,2025年8月8日北京时间凌晨,OpenAI终于揭开了其新一代旗舰模型——GPT-5的神秘面纱。这不仅仅是一次常规的产品迭代,更被整个行业视为一块试金石&a…

【Avalonia】无开发者账号使用iOS真机调试跨平台应用

文章目录1. 要求1.1 无需Apple开发者账号1.2 最新版mac系统1.3 最新版Xcode2. 配对Mac3. 配置开发证书3.1 创建一个名为MTClient的Xcode项目3.2 找到签名证书3.3 配置签名3.4 配置标识符4. 真机调试4.1 设置应用首屏 Launch Screen4.2 设置应用图标5. 问题5.1 DI异常该问题的解…

开发手札:UnrealEngine和Unity3d坐标系问题

最近把一套网络模块和一套组件模块从u3d改造到ue4。网络模块通用性很高,毕竟协议都是通用网络协议,改造后没啥问题。但是改造组件模块的时候就遇到了问题。首先,unity3d的坐标系是标准左手坐标系,如下:同时自己的几何算…

Python Gradio 写的-文本情感分析小软件 (不用Html+css+js 可写出网页来)

1. 安装 Gradio首先,需要安装 Gradio 库。打开命令行,执行以下命令:pip install gradio注意:Gradio 需要 Python 3.10 或更高版本。推荐在虚拟环境中安装,避免依赖冲突。2. 创建情感分析应用创建一个 sentiment_analys…

强化学习笔记:从Q学习到GRPO

推荐学习huggingface的强化学习课程,全面了解强化学习的发展史。 以下是个人笔记,内容不一定完整,有些是个人理解。 基于值函数(value function)的强化学习 基于值函数(value function)的强化学习:学习的是一个值函数&#xff0…

X4000 私有 5G 实验室入门套件

私有 5G 实验室入门套件简介技术规格5G核心网5G 接入网简介 入门级紧凑型私人 5G 实验室入门套件提供了经济高效的专用 5G 小型基站,非常适合在安全受控的室内环境中进行 5G 培训、开发、测试和演示,从而实现 5G 应用和物联网设备的连接。 东枫科技 是…

Openlayers基础教程|从前端框架到GIS开发系列课程(19)地图控件和矢量图形绘制

1. 地图控件本篇教程主要介绍以下地图控件:视图跳转控件放大缩小控件全屏控件实现步骤1. 初始化地图上一篇已经介绍了,这一篇直接跳过该步骤。2. 视图跳转控件/* 视图跳转控件 */const ZoomToExtent new ol.control.ZoomToExtent({ extent: [110, 30, …

【JVM】流程汇总

【JVM】流程汇总【一】编译过程和内存分布【1】案例程序:简单的 Java 类【2】Java 编译过程:从.java到.class(1)编译命令(2)编译结果(3)字节码的作用【3】Java 运行过程:…

无人机航拍数据集合集(猫脸码客)

无人机航拍数据集|第1期 无人机影像中森林火灾目标检测YOLO数据集6943张yolov11/yolov8/yolov5可训练 数据集地址:无人机影像中森林火灾目标检测YOLO数据集 无人机航拍数据集|第2期 无人机影像中高速公路目标检测YOLO数据集787张yolov11/yolov8/yolov5可训练 数据集…

蓝牙基础:FIFO(First-In-First-Out)缓存区

在蓝牙通信中,FIFO(First-In-First-Out,先进先出)缓存区是解决数据传输中“速度不匹配”和“时序异步”问题的核心机制,广泛应用于蓝牙芯片内部、协议栈各层级及主从设备交互中。其核心作用是临时存储数据,…
推荐文章