Android中RecyclerView基本使用

一、RecyclerView 核心概念

1. 基本组件关系
2. 核心组件作用
  • Adapter:数据与视图的桥梁

  • LayoutManager:控制布局方式(线性/网格/瀑布流)

  • ViewHolder:缓存视图组件

  • ItemDecoration:添加分割线等装饰

  • ItemAnimator:处理增删动画


二、基础使用流程

1. 添加依赖
bash 复制代码
implementation 'androidx.recyclerview:recyclerview:1.3.2'
2. XML布局
XML 复制代码
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
3. 实现 Adapter
Kotlin 复制代码
class MyAdapter(private val data: List<String>) : 
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    // 创建 ViewHolder
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_layout, parent, false)
        return MyViewHolder(view)
    }

    // 绑定数据
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bind(data[position])
    }

    override fun getItemCount() = data.size

    // ViewHolder 定义
    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val textView: TextView = itemView.findViewById(R.id.tv_item)

        fun bind(item: String) {
            textView.text = item
        }
    }
}
4. 设置 RecyclerView
Kotlin 复制代码
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(listOf("Item 1", "Item 2", "Item 3"))

三、ViewHolder 生命周期详解

关键生命周期方法:

  1. onCreateViewHolder():创建新视图

  2. onBindViewHolder():绑定数据

  3. onViewAttachedToWindow():视图进入屏幕

  4. onViewDetachedFromWindow():视图离开屏幕

  5. onViewRecycled():视图进入回收池(可在此释放资源)


四、性能优化策略

1. 基础优化
Kotlin 复制代码
// 设置固定尺寸提升测量效率
recyclerView.setHasFixedSize(true) 

// 增加缓存数量(默认=2)
recyclerView.itemViewCacheSize = 10
2. 高效数据绑定
Kotlin 复制代码
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    // 使用 payload 实现局部更新
    holder.bind(data[position])
}

// 使用 DiffUtil 智能更新
val diffResult = DiffUtil.calculateDiff(MyDiffCallback(oldList, newList))
diffResult.dispatchUpdatesTo(adapter)
3. 视图复用优化
Kotlin 复制代码
// Adapter 中重写 getItemViewType()
override fun getItemViewType(position: Int): Int {
    return when (data[position].type) {
        ItemType.TEXT -> 0
        ItemType.IMAGE -> 1
    }
}

// 根据 viewType 创建不同 ViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) {
    return when (viewType) {
        0 -> TextViewHolder(...)
        1 -> ImageViewHolder(...)
    }
}
4. 图片加载优化
Kotlin 复制代码
fun bind(item: Item) {
    Glide.with(itemView)
        .load(item.imageUrl)
        .apply(RequestOptions().override(100, 100)) // 限制尺寸
        .into(imageView)
}

override fun onViewRecycled() {
    Glide.with(itemView).clear(imageView) // 及时释放
}

五、事件监听实现

1. 点击事件处理
Kotlin 复制代码
// 在 ViewHolder 中设置监听
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    init {
        itemView.setOnClickListener {
            val pos = adapterPosition
            if (pos != RecyclerView.NO_POSITION) {
                // 通过接口回调事件
                listener?.onItemClick(pos)
            }
        }
    }
}

// 定义回调接口
interface OnItemClickListener {
    fun onItemClick(position: Int)
}
2. 长按事件
Kotlin 复制代码
itemView.setOnLongClickListener {
    val pos = adapterPosition
    if (pos != RecyclerView.NO_POSITION) {
        listener?.onItemLongClick(pos)
        true
    } else false
}
3. 滑动监听
Kotlin 复制代码
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        // dy > 0:向上滚动
        // dy < 0:向下滚动
    }
    
    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        when (newState) {
            RecyclerView.SCROLL_STATE_IDLE -> { /* 停止滚动 */ }
            RecyclerView.SCROLL_STATE_DRAGGING -> { /* 用户拖动 */ }
            RecyclerView.SCROLL_STATE_SETTLING -> { /* 惯性滑动 */ }
        }
    }
})

六、高级技巧

1. 嵌套滚动优化
XML 复制代码
<!-- 子RecyclerView设置 -->
android:nestedScrollingEnabled="false"
2. 预加载实现
Kotlin 复制代码
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        val lastVisible = (layoutManager as LinearLayoutManager)
            .findLastVisibleItemPosition()
        if (lastVisible > itemCount - 5) {
            // 触发预加载
        }
    }
})
3. 高效更新策略
Kotlin 复制代码
// 使用 ListAdapter 自动处理差异更新
class MyAdapter : ListAdapter<Item, MyViewHolder>(DiffCallback()) {
    // 自动计算差异更新
}

class DiffCallback : DiffUtil.ItemCallback<Item>() {
    override fun areItemsTheSame(old: Item, new: Item) = old.id == new.id
    override fun areContentsTheSame(old: Item, new: Item) = old == new
}

最佳实践总结

  1. ViewHolder模式:必须使用避免重复findViewById

  2. 局部更新:优先使用DiffUtil/ListAdapter

  3. 资源释放:在onViewRecycled()中释放图片等资源

  4. 事件委托:通过接口回调代替在Adapter中处理逻辑

  5. 类型区分:多类型视图使用getItemViewType()

  6. 内存监控:使用Profiler检测滚动时的内存波动

相关推荐
三少爷的鞋40 分钟前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)4 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码6 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程7 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程9 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程11 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程11 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程11 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓11 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程11 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer