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

相关推荐
AI视觉网奇2 小时前
android adb调试 鸿蒙
android
NRatel3 小时前
GooglePlay支付接入记录
android·游戏·unity·支付·googleplay
在下历飞雨3 小时前
为啥选了Kuikly?2025“液态玻璃时代“六大跨端框架横向对比
android·harmonyos
雨白3 小时前
Android 自定义View:详解尺寸测量 onMeasure
android
用户093 小时前
Gradle 隔离项目方法总结(Isolated)
android·kotlin
召摇3 小时前
Big O 表示法详解
android·javascript
用户0273851840263 小时前
[Android] UI进阶笔记:从 Toolbar 到可折叠标题栏的完整实战
android
猿小蔡3 小时前
Robolectric拿到当前的Activity
android·单元测试
vocal3 小时前
【我的安卓第一课】Activity 生命周期下的重要函数 finish/onBackPressed
android
alexhilton4 小时前
Android应用的架构演进
android·kotlin·android jetpack