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 studio
android·ide·android studio
xzkyd outpaper1 小时前
Kotlin 协程线程切换机制详解
android·开发语言·kotlin
Near_Li2 小时前
uniapp-使用mumu模拟器调试安卓APP
android·uni-app
zhangphil3 小时前
Android MediaMetadataRetriever取视频封面,Kotlin(1)
android·kotlin
onthewaying6 小时前
详解 Android GLSurfaceView 与 Renderer:开启你的 OpenGL ES 之旅
android·opengl
aqi006 小时前
FFmpeg开发笔记(八十)使用百变魔音AiSound实现变声特效
android·ffmpeg·音视频·直播·流媒体
我命由我123458 小时前
Android 开发问题:The specified child already has a parent.
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
pengyu8 小时前
【Kotlin系统化精讲:肆】 | 数据类型之基本数据类型:代码世界里的砖瓦水泥沙
android·kotlin
三雒9 小时前
凡猿修仙传: Android SO 压缩方案 Nano
android