当前位置: 首页 > 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.xdnf.cn/news/1268245.html

相关文章:

  • Datawhale+AI夏令营_让AI读懂财报PDF task2深入赛题笔记
  • 学习Java的Day28
  • 常用信号深度解析(SIGINT、SIGPIPE、SIGALRM、SIGTERM等)
  • Android 锁屏图标的大小修改
  • 线上排查问题的一般流程是怎么样的?
  • [激光原理与应用-207]:光学器件 - 光纤种子源激光器常用元器件
  • python---类型别名
  • 新手小白使用jQuery在实际开发中常用到的经验
  • ABP VNext + Akka.NET:高并发处理与分布式计算
  • 从 AI 到实时视频通道:基于模块化架构的低延迟直播全链路实践
  • Vuex与Pinia对比,以及技术选型
  • 《C++进阶之继承多态》【普通类/模板类的继承 + 父类子类的转换 + 继承的作用域 + 子类的默认成员函数】
  • 10.final, finally, finalize的区别
  • 【自动化运维神器Ansible】playbook自动化部署Nginx案例解析:助力从零构建高效Web服务
  • 2025 大语言模型系统学习路线:从基础到部署与优化的全方位指南(含权威资源与项目实战)
  • 4深度学习Pytorch-神经网络--损失函数(sigmoid、Tanh、ReLU、LReLu、softmax)
  • IDEA快捷键壁纸分享
  • 光伏面板损伤检出率↑91%!陌讯多模态识别算法在无人机巡检的落地实践
  • AI 破解数据质量难题:从混乱到可信的智能进化之路
  • 计算机网络1-6:计算机网络体系结构
  • webwork的学习
  • 非常简单!从零学习如何免费制作一个lofi视频
  • 香橙派 RK3588 部署千问大模型 Qwen2-VL-2B 推理视频
  • 2025华数杯数学建模C题:可调控生物节律LED光源全解析
  • 2025华数杯B题一等奖方案:网络切片无线资源管理全解析(附Python/MATLAB代码)
  • 机器学习(西瓜书)学习——绪论
  • LeetCode 面试经典 150_数组/字符串_分发糖果(15_135_C++_困难)(贪心算法)
  • 【Redis7.x】docker配置主从+sentinel监控遇到的问题与解决
  • GPT-5:数字大脑的进化史
  • 1393. 与7无关的数?