3、第一个 RecyclerView:在 XML 布局中声明 RecyclerView,在 Activity 中绑定。
好,咱们正式开始动手了。
这一节,我会带你写出你的第一个 RecyclerView。说白了,就是三步:
- 在 XML 布局里放一个 RecyclerView 控件
- 在 Activity 里找到它(绑定)
- 给它设置 LayoutManager,让它能滚动起来
别小看这三步。我见过不少新手,RecyclerView 写不出来,最后发现是 XML 里忘了加 android:layout_height。嗯,这种坑我踩过,所以咱们一步步来。
3.1 在 XML 布局中声明 RecyclerView
首先,打开你的 activity_main.xml。如果你用的是 Android Studio 默认模板,里面应该有个 TextView 写着 "Hello World!"。删掉它,换成 RecyclerView。
我个人习惯把 RecyclerView 放在根布局里,直接占满全屏。当然,你也可以放在任何容器里,比如 LinearLayout 或 ConstraintLayout。但有一点要注意:RecyclerView 必须有一个确定的宽高,否则它不会显示任何内容。
核心要点:RecyclerView 的宽高不能是 wrap_content,除非你明确知道自己在做什么。否则,用 match_parent 或固定 dp 值。
来看代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
这里我用了 androidx.recyclerview.widget.RecyclerView,注意是完整包名。为什么?因为 RecyclerView 是 AndroidX 库里的控件,不是系统内置的。如果你用的是旧版 support 库,包名会不一样。但我建议你直接用 AndroidX,毕竟现在新项目都默认用这个。
小提示:如果你在 XML 里输入 RecyclerView 没有自动补全,说明你的 build.gradle 里还没添加依赖。去 app 模块的 build.gradle 里加上:
implementation 'androidx.recyclerview:recyclerview:1.3.2'
然后 Sync 一下项目。
3.2 在 Activity 中绑定 RecyclerView
XML 写好了,接下来去 MainActivity.kt 里绑定它。
绑定方式有两种:
- 传统方式:用
findViewById - 现代方式:用 View Binding 或 Data Binding
我个人推荐 View Binding,因为它类型安全,而且能避免空指针。不过这一节咱们先用 findViewById,因为最直观,也最容易理解。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 绑定 RecyclerView
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
// 设置 LayoutManager
recyclerView.layoutManager = LinearLayoutManager(this)
}
}
看到没?就这几行代码。但这里有个关键点:LayoutManager。
RecyclerView 本身不知道该怎么摆放列表项。你得告诉它:是垂直滚动?水平滚动?还是网格?这个「告诉」的动作,就是通过 LayoutManager 完成的。
我刚开始学 RecyclerView 时,忘了设置 LayoutManager,结果列表一片空白。当时我还以为是数据的问题,查了半天……后来才发现,RecyclerView 没有 LayoutManager 就不会显示任何子 View。这个坑,你记住就好。
注意:不设置 LayoutManager 的 RecyclerView,就像没有方向盘的汽车——它动不了。运行时不会报错,但列表就是空的。
3.3 LayoutManager 的三种常用类型
咱们常用的 LayoutManager 有三种,我整理了一张表:
| 类型 | 类名 | 适用场景 |
|---|---|---|
| 线性布局 | LinearLayoutManager | 垂直或水平列表,比如通讯录、设置页 |
| 网格布局 | GridLayoutManager | 网格展示,比如相册、商品列表 |
| 瀑布流布局 | StaggeredGridLayoutManager | 高度不固定的网格,比如 Pinterest 风格 |
这一节咱们先用 LinearLayoutManager,垂直方向。后面章节会逐一讲解其他类型。
3.4 核心逻辑流程图
为了让你更直观地理解 RecyclerView 的初始化流程,我画了一张图:
你看,流程其实很简单。但很多初学者会卡在「设置 LayoutManager」这一步。为什么?因为 RecyclerView 不像 ListView 那样默认就有垂直滚动。它把布局策略完全交给了开发者,这给了你极大的灵活性,但也意味着你必须显式地配置它。
3.5 完整代码示例
最后,咱们把这一节的内容串起来,写一个完整的 MainActivity.kt:
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 1. 绑定 RecyclerView
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
// 2. 设置 LayoutManager(垂直方向)
recyclerView.layoutManager = LinearLayoutManager(this)
// 3. 设置 Adapter(下一节会讲,先留空)
// recyclerView.adapter = MyAdapter()
}
}
注意,这里我注释掉了 Adapter 的设置。因为咱们还没写 Adapter 呢。下一节,我会带你写一个最简单的 Adapter,让列表真正显示数据。
个人经验:我在项目里经常用 LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) 来实现横向滚动列表,比如图片轮播。第三个参数 reverseLayout 控制是否反向滚动,一般设为 false 就行。
3.6 常见问题排查
如果你运行后屏幕一片空白,别慌。按这个顺序检查:
- RecyclerView 的宽高:是不是 match_parent?有没有被其他布局遮挡?
- LayoutManager 是否设置:没设置的话,RecyclerView 不会显示任何子 View。
- 依赖是否添加:build.gradle 里有没有 implementation 'androidx.recyclerview:recyclerview:xxx'?
- Activity 是否正确加载布局:setContentView 的布局文件是不是 activity_main?
我曾经在一个项目里,因为 XML 文件名写错了,导致 RecyclerView 一直没加载出来。查了半小时才发现是 setContentView(R.layout.activity_main) 里的 R 引用错了模块。嗯,这种低级错误,谁都会犯,关键是学会快速定位。
好了,这一节的内容就到这里。你已经学会了如何在 XML 里声明 RecyclerView,在 Activity 里绑定它,并设置 LayoutManager。下一节,咱们会写一个真正的 Adapter,让列表里出现文字。
公众号:蓝海资料掘金营,微信deep3321