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

相关推荐
xiangpanf29 分钟前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx3 小时前
安卓线程相关
android
消失的旧时光-19434 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon5 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon5 小时前
VSYNC 信号完整流程2
android
dalancon5 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013846 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android6 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才7 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶8 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle