RecyclerView 是 Android 官方提供的可滚动列表容器,它是 ListView 和 GridView 的升级替代品。
它的核心设计理念是 "回收复用"——当某个条目滚出屏幕时,系统不会销毁它,而是把它"回收"起来,等新条目滚入时直接复用这个 View,避免重复创建。
2. 核心组成部分
RecyclerView 的使用需要掌握三个核心组件:
- Adapter(适配器):搭桥人,把数据和 UI 布局连接起来
- ViewHolder(视图持有者):持有 Item 中每个控件的引用,避免重复 findViewById
- LayoutManager(布局管理器):决定 Item 排列方式
3. 实战
添加依赖
// app/build.gradle.kts
dependencies {
implementation("androidx.recyclerview:recyclerview:1.3.2")
}
实现 Adapter
class ContactAdapter(
private val contacts: MutableList<Contact>
) : RecyclerView.Adapter<ContactAdapter.ContactViewHolder>() {
class ContactViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val name: TextView = itemView.findViewById(R.id.tvName)
val phone: TextView = itemView.findViewById(R.id.tvPhone)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_contact, parent, false)
return ContactViewHolder(view)
}
override fun onBindViewHolder(holder: ContactViewHolder, position: Int) {
val contact = contacts[position]
holder.name.text = contact.name
holder.phone.text = contact.phone
}
override fun getItemCount(): Int = contacts.size
}
在 Activity 中使用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.rvContacts)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.addItemDecoration(
DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
)
val contacts = (1..20).map { i ->
Contact(i.toLong(), "联系人 $i", "1380013800$i", R.drawable.ic_avatar)
}.toMutableList()
recyclerView.adapter = ContactAdapter(contacts)
}
}
4. LayoutManager 三种模式
// 垂直列表
recyclerView.layoutManager = LinearLayoutManager(this)
// 水平列表
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
// 网格(2列)
recyclerView.layoutManager = GridLayoutManager(this, 2)
// 瀑布流
recyclerView.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
5. 避坑指南
- 忘记 LayoutManager:不设置就看不见内容
- 数据变化没通知:contacts.add() 后必须调用 notifyItemInserted()
- 混淆创建和绑定:onCreateViewHolder 负责创建,onBindViewHolder 负责填充
6. 总结
RecyclerView 是 Android 开发的基石组件,掌握它就能轻松实现各类列表界面。