当前位置: 首页 > 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.dtcms.com/a/323027.html

相关文章:

  • C# OnnxRuntime yolov8 纸箱检测
  • 动态规划(相同地方不同状态)
  • 如何控制需求交付节奏
  • 【数据分析】03 - pandas
  • 深入解析QUIC协议:下一代音视频传输技术的突破与实践
  • 前端如何安全存储 API 密钥 —— 两种实用方案
  • 动手学深度学习(pytorch版):第二章节——预备知识(1)——数据操作
  • pytorch llm 计算flops和参数量
  • 【C++】继承机制全解析
  • Spring-rabbit使用实战七
  • 48伏电气系统—— 铺就电动出行之路的关键技术
  • 大语言模型中的幻觉
  • 24SpringCloud黑马商城微服务整合Seata重启服务报错的解决办法
  • 使用SymPy lambdify处理齐次矩阵的高效向量化计算
  • Poetry与UV——现代Python依赖管理的革新者
  • GitHub 趋势日报 (2025年08月08日)
  • java10学习笔记
  • EPI2ME分析软件测试
  • Java 8 特性
  • PG靶机 - Shiftdel
  • 计算机网络:CIDR地址块划分子网可以使用VLSM吗?
  • 使用 Vuepress + GitHub Pages 搭建项目文档(2)- 使用 GitHub Actions 工作流自动部署
  • [激光原理与应用-206]:光学器件 - SESAM - 基本结构与工作原理
  • “高大上“的SpringCloud?(微服务体系入门)
  • 关于灰度图像相似度的损失函数(笔记)
  • 【Datawhale AI夏令营】基于多模态RAG的企业财报问答系统
  • MySQL弹幕内容字段设计总结
  • Linux Makefile解析
  • 元宇宙技术如何改变社交方式?
  • MyBatis联合查询 - 注解篇