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检测滚动时的内存波动

相关推荐
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android