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

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.lryc.cn/news/614818.html

相关文章:

  • TDengine IDMP 快速体验(1. 通过云服务)
  • 【CVPR2025】计算机视觉|PX:让模型训练“事半功倍”!
  • vscode/trae 的 settings.json 中配置 latex 的一些记录
  • 设备点检系统二维码的应用
  • 我用C++和零拷贝重构了文件服务器,性能飙升3倍,CPU占用降低80%
  • Amazon Linux 训练lora模型的方式
  • 《算法导论》第 14 章 - 数据结构的扩张
  • ruoyi关闭shiro校验,任何接口可以直接访问
  • C++-红黑树
  • [C/C++线程安全]_[中级]_[多线程如何使用共享锁提升性能]
  • Meta AI水印计划的致命缺陷——IEEE Spectrum深度文献精读
  • 第4章 程序段的反复执行4.2while语句P128练习题(题及答案)
  • ppt 生成视频的 ai 大模型全面解析
  • (talk)西安大模型开发者talk
  • vue+flask大模型写诗诗词推荐与可视化系统
  • 浏览器面试题及详细答案 88道(01-11)
  • 项目一系列-第4章 在线接口文档 代码模板改造
  • AJAX与axios框架
  • Netty-Rest搭建笔记
  • 系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇
  • 轻松实现浏览器自动化——AI浏览器自动化框架Stagehand
  • 【华为机试】63. 不同路径 II
  • C++简单项目跟练【通讯录管理系统000】
  • 数据集: TSPLIB旅行商问题-对称TSP数据集
  • 宁商平台税务升级之路:合规为纲,服务为本
  • 五、SpringBoot工程打包与运行
  • 解决 MinIO 上传文件时报 S3 API Requests must be made to API port错误
  • Sklearn 机器学习 数据降维PCA 使用PCA算法
  • Java 之 设计模式
  • Python day38