前言
在当前 Android 应用开发中,列表布局几乎是所有资讯类、社交类、电商类 App 必不可少的核心 UI 组件。从早期的 ListView 到如今主流的 RecyclerView,列表控件的性能、扩展性和使用体验得到了极大提升。本次我们基于老师提供的 HeadLine 仿今日头条项目,完整讲解项目中RecyclerView 的实际使用方式、项目所用到的布局文件与各类控件,以及它们在新闻列表页面中具体如何搭配、如何实现多样式新闻卡片效果。
本文面向 Android 初学者,内容偏实战、重应用,全程围绕仿今日头条项目代码与界面效果展开,帮助大家理解 RecyclerView 从布局声明、数据绑定到多样式加载的完整流程,同时掌握 Android 常见布局与控件的实际用法。
一、项目概述与界面结构
本次 HeadLine 仿今日头条项目主要实现一个简化版的今日头条首页,核心功能是展示混合样式的新闻列表,包括:
- 置顶新闻(无图样式)
- 单张图片新闻
- 三张图片新闻
从界面结构上可以分为三部分:
- 顶部标题栏与搜索区域
- 中部频道切换标签栏
- 底部新闻列表(RecyclerView 实现)
整个项目的核心技术点就是使用 RecyclerView 实现多布局类型的列表展示,同时搭配多种 Android 基础布局与控件完成 UI 搭建。项目结构简洁、逻辑清晰,非常适合用来学习 RecyclerView 标准用法。
二、RecyclerView 与 ListView 对比
在正式讲解 RecyclerView 使用之前,我们先简单对比它与传统 ListView 的差异,帮助理解为什么现在项目都优先使用 RecyclerView。
2.1 扩展性更强
ListView 只能实现垂直滚动,而 RecyclerView 内置支持:
- 垂直列表
- 水平列表
- 网格布局
- 瀑布流布局
只需要更换 LayoutManager 即可实现,无需修改适配器与数据结构。
2.2 强制使用 ViewHolder 模式
ListView 并不强制使用 ViewHolder,开发者容易写出重复 findViewById 的低效代码。RecyclerView 在 Adapter 中强制要求使用 ViewHolder,天然实现了视图复用,滑动更流畅、内存占用更低。
2.3 动画与拓展更方便
RecyclerView 自带条目增删动画,并且支持自定义动画、分割线、拖拽滑动等功能,而 ListView 实现这些功能需要大量额外代码。
在本次仿今日头条项目中,因为要实现两种以上不同布局的新闻条目,使用 RecyclerView 远比 ListView 简单、规范,这也是项目选择 RecyclerView 的核心原因。
三、RecyclerView 在项目中的完整使用流程
RecyclerView 的使用可以分为五步标准流程:
- 在布局文件中声明 RecyclerView 控件
- 编写 Item 布局(单图、三图)
- 创建数据实体类 NewsBean
- 编写 RecyclerView.Adapter 适配器
- 在 Activity 中绑定数据、设置适配器
下面结合项目代码逐一讲解。
3.1 在主布局中添加 RecyclerView
首先在 activity_main.xml 中放置 RecyclerView,作为新闻列表的容器:
这一步相当于在界面上 “开辟一块区域” 用来展示所有新闻条目。它宽度铺满屏幕、高度铺满剩余空间,是最常见的列表写法。
3.2 编写多种 Item 布局文件
仿今日头条项目需要至少两种条目布局:
3.2.1 单图新闻布局
通常是左侧文字、右侧一张图片,使用横向 LinearLayout 或 ConstraintLayout 实现。包含控件:
- 新闻标题 TextView
- 来源、评论、时间 TextView
- 图片 ImageView
3.2.2 三图新闻布局
上方标题,下方三张横向排列的图片,底部是来源信息。包含控件:
- 标题 TextView
- 三个水平 ImageView
- 来源信息 TextView
项目通过不同布局文件,实现视觉上明显区分的新闻样式。
3.3 创建数据实体类 NewsBean
为了把标题、图片、类型等信息封装起来,项目创建了 NewsBean:
- type:用来标记当前新闻是单图还是三图
- imgList:存放图片资源 id
- 其他字段对应界面上的文字内容
3.4 构建模拟数据
在 MainActivity 中使用数组构建假数据:
然后通过循环将数组封装进 NewsBean,并添加到 List 集合中。
3.5 编写多布局 Adapter
适配器是 RecyclerView 最核心的部分,项目中的 Adapter 主要做三件事:
- 根据 type 返回不同布局
- 创建不同的 ViewHolder
- 绑定数据到对应控件
关键方法:
通过这个方法,RecyclerView 就知道哪一行该加载哪种布局。
在 onCreateViewHolder 中根据 viewType 加载不同的 xml 布局;在 onBindViewHolder 中根据类型设置标题、图片、来源等内容。
3.6 在 MainActivity 中使用 RecyclerView
最后在 Activity 的 onCreate 中完成初始化:
- LayoutManager 用 LinearLayoutManager 表示垂直列表
- 创建 Adapter 并传入数据
- 调用 setAdapter 完成绑定
运行后即可看到与效果图一致的新闻列表。
四、项目中使用的布局资源详解
仿今日头条项目大量使用 Android 基础布局,理解这些布局是学会界面开发的关键。
4.1 LinearLayout(线性布局)
项目中最常用的布局,分为水平和垂直两种。
使用场景:
- 主界面整体垂直排列:标题栏 → 标签栏 → 列表
- 单图新闻:左右结构,文字 + 图片
- 三图新闻:三张图片横向并排
关键属性:
android:orientation="vertical"垂直排列android:orientation="horizontal"水平排列android:layout_weight权重分配,实现等宽三图
优点:简单、易用、嵌套结构清晰,适合初学者。
4.2 RelativeLayout(相对布局)
在标题栏、搜索框、Item 内部对齐时使用。可以通过:
layout_toRightOflayout_belowcenterVertical
实现控件相对位置摆放,比 LinearLayout 更灵活。
4.3 HorizontalScrollView(横向滚动布局)
项目中顶部频道标签(推荐、抗疫、小视频等)使用该布局实现横向滑动。它内部只能包含一个子布局,通常套一层 LinearLayout 放置多个 TextView。
4.4 布局使用总结
在本项目中:
- 整体结构用 LinearLayout 垂直排列
- 频道栏用 HorizontalScrollView 实现横向滑动
- 新闻条目内部用 LinearLayout + RelativeLayout 组合
- 图片对齐、排版用 layout_weight、margin、padding 调整
这种组合方式也是 Android 开发中最经典、最常用的界面写法。
五、项目中使用的控件及其用法
项目中用到的控件不多,但都是 Android 最核心、最常用的控件,下面逐一说明它们在项目中的作用与用法。
5.1 TextView(文本显示控件)
最基础也是最常用的控件,项目中大量使用:
- 新闻标题
- 新闻来源
- 评论数、发布时间
- 频道标签
常用属性:
- maxLines 限制最大行数
- ellipsize="end" 多出文字显示省略号,非常适合新闻标题
5.2 ImageView(图片显示控件)
用来显示新闻图片:
- 单图新闻右侧图片
- 三图新闻的三张配图
使用方式:
项目中本地图片放在 drawable 文件夹,通过 R.drawable.xxx 引用。
常用属性:
android:scaleType="centerCrop"按比例裁剪,保证图片不变形android:adjustViewBounds="true"自适应图片比例
5.3 RecyclerView(列表控件)
前面已经详细讲过,它是项目核心控件,作用是展示大量重复或相似结构的数据。
特点:
- 可复用 item,减少内存消耗
- 支持多布局
- 滑动流畅
- 可设置垂直、水平、网格等样式
5.4 EditText(输入框控件)
项目顶部搜索栏使用 EditText,实现可输入的搜索框。
常用属性:
android:hint="搜你想搜的"android:background设置圆角背景android:padding内边距
5.5 View(分割线控件)
有些新闻条目之间会用一个高 1px 的 View 作为分割线:
效果图如下:
前言
在 Android 开发的学习历程中,列表展示是绕不开的核心知识点。从早期的 ListView 到如今主流的 RecyclerView,列表控件承载了绝大多数 App 的核心内容展示逻辑,无论是资讯类 App 的信息流、电商类 App 的商品列表,还是社交类 App 的动态流,都离不开列表控件的支撑。
本次我们以一个购物商城 ListView 项目为核心,结合仿今日头条项目的列表实现逻辑,完整拆解 ListView 的使用流程、项目中的布局资源、控件用法,以及 ListView 与 RecyclerView 的核心差异。本文全程围绕项目代码与运行效果图展开,从基础原理到实战实现,从布局搭建到代码优化,为 Android 初学者提供一份可直接落地、可深度拓展的 ListView 实战指南,全文约 6000 字,覆盖 ListView 开发的全流程核心知识点。
一、项目概述与界面结构拆解
1.1 项目背景与功能定位
本次购物商城项目是 Android 入门级经典实战案例,核心目标是通过 ListView 实现商品列表的展示,还原电商 App 商品页的基础样式。项目最终运行效果如图所示:
- 顶部为橙色标题栏,显示 “购物商城” 标题;
- 主体为纵向滚动的商品列表,每个列表项(Item)包含商品图片、商品名称、商品价格三个核心元素;
- 列表项样式统一,图片居左、文字居右,价格以橙色高亮显示,符合电商 App 的视觉设计规范;
- 列表支持纵向滑动,可完整展示 6 个商品条目,滑动流畅无卡顿,界面布局规整,适配手机屏幕尺寸。
该项目的核心技术点是 ListView 控件的使用 + BaseAdapter 自定义适配器 + 多控件布局实现,同时覆盖了 Android 基础布局、常用控件的实战用法,是学习 Android 列表开发的经典入门案例,也是仿今日头条等资讯类 App 列表实现的基础原型。
1.2 项目核心代码结构
项目的核心代码位于 cn.edu.listview 包下的 MainActivity.java,同时包含两个核心布局文件,完整结构如下:
plaintext
app/src/main/
├── java/cn/edu/listview/
│ └── MainActivity.java # 核心业务代码,ListView 逻辑实现
├── res/
│ ├── layout/
│ │ ├── activity_main.xml # 主布局,承载 ListView 控件
│ │ └── list_item.xml # 列表项布局,定义每个商品的展示样式
│ ├── drawable/ # 商品图片资源(table、apple、cake 等)
│ └── values/ # 字符串、颜色、尺寸等配置文件
└── AndroidManifest.xml # 应用清单文件,声明 Activity
其中,MainActivity.java 是项目的逻辑中枢,负责 ListView 初始化、数据准备、适配器绑定;两个布局文件是界面的视觉核心,定义了列表的整体结构与每个商品项的展示样式;drawable 目录存放商品图片资源,为列表提供视觉内容。
二、ListView 核心原理与项目中的完整使用流程
2.1 ListView 基础原理概述
ListView 是 Android 早期的核心列表控件,继承自 AbsListView,用于展示垂直滚动的条目列表。其核心工作原理是 MVC 模式:
- Model(数据层) :项目中的商品名称、价格、图片等数据,以数组形式存储;
- View(视图层) :
activity_main.xml(列表容器)和list_item.xml(列表项布局),负责界面渲染; - Controller(控制层) :
BaseAdapter适配器,作为数据与视图的桥梁,负责将数据绑定到列表项,实现数据的展示与复用。
ListView 的核心优势是轻量化、易上手,适合初学者快速实现列表功能;其核心机制是 View 复用 + 适配器模式,通过复用 convertView 减少布局 inflate 次数,优化列表滑动性能,避免内存浪费。
2.2 ListView 在项目中的完整使用步骤
结合项目代码,ListView 的使用可分为 5 个标准步骤,每个步骤环环相扣,缺一不可:
步骤 1:在主布局中声明 ListView 控件
首先需要在 activity_main.xml 中添加 ListView 控件,作为商品列表的容器,代码如下:
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 顶部标题栏 -->
<TextView
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="#FF9800"
android:text="购物商城"
android:textColor="#FFFFFF"
android:textSize="24sp"
android:gravity="center"/>
<!-- ListView 列表容器 -->
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#E0E0E0"
android:dividerHeight="1dp"/>
</LinearLayout>
- 外层使用垂直
LinearLayout,实现 “标题栏 + 列表” 的纵向布局结构; - ListView 的
id为lv,用于在 Activity 中通过findViewById初始化; divider和dividerHeight属性用于设置列表项之间的分割线,提升界面层次感;layout_width和layout_height设为match_parent,让 ListView 铺满屏幕剩余空间,适配不同尺寸的手机屏幕。
步骤 2:创建列表项布局(list_item.xml)
列表项布局定义了每个商品条目的展示样式,是用户看到的核心视觉内容,项目中采用 “左图右文” 的经典电商布局,代码如下:
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:gravity="center_vertical">
<!-- 商品图片 -->
<ImageView
android:id="@+id/iv"
android:layout_width="120dp"
android:layout_height="120dp"
android:scaleType="centerCrop"
android:contentDescription="@null"/>
<!-- 文字区域(垂直排列) -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="16dp"
android:orientation="vertical">
<!-- 商品名称 -->
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="商品名称"
android:textColor="#000000"
android:textSize="20sp"
android:layout_marginBottom="8dp"/>
<!-- 商品价格 -->
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="价格:100元"
android:textColor="#FF9800"
android:textSize="20sp"/>
</LinearLayout>
</LinearLayout>
- 外层使用水平
LinearLayout,实现 “图片居左、文字居右” 的布局; ImageView用于展示商品图片,scaleType="centerCrop"保证图片按比例裁剪,不变形;- 文字区域使用垂直
LinearLayout,通过layout_weight="1"让文字区域占满剩余空间,适配不同屏幕宽度; - 价格
TextView设置橙色文字,与标题栏颜色呼应,突出价格信息,符合电商设计规范; padding和margin属性用于调整控件间距,提升界面美观度,避免内容拥挤。
步骤 3:准备数据源
在 MainActivity.java 中定义商品数据,包括商品名称、价格、图片资源 ID,代码如下:
java
运行
//商品名称与价格数据集合
private String[] titles = {"桌子", "苹果", "蛋糕", "线衣", "猕猴桃", "围巾"};
private String[] prices = {"1800元", "10元/kg", "300元", "350元", "10元/kg", "280元"};
//图片数据集合
private int[] icons = {R.drawable.table, R.drawable.apple, R.drawable.cake,
R.drawable.wireclothes, R.drawable.kiwifruit, R.drawable.scarf};
- 三个数组一一对应,
titles[i]、prices[i]、icons[i]对应第i个商品的完整信息; - 图片资源以
R.drawable.xxx的形式存储,对应drawable目录下的图片文件; - 数据量设置为 6 条,覆盖不同类型商品(家具、水果、食品、服饰),验证列表的展示效果。
步骤 4:自定义 BaseAdapter 适配器
适配器是 ListView 的核心,负责将数据与布局绑定,实现列表项的渲染与复用。项目中继承 BaseAdapter 自定义适配器,核心代码如下:
java
运行
class MyBaseAdapter extends BaseAdapter {
@Override
public int getCount() { //获取条目的总数
return titles.length; //返回条目的总数
}
@Override
public Object getItem(int position) {
return titles[position]; //返回条目的数据对象
}
@Override
public long getItemId(int position) {
return position; //返回条目的Id
}
//获取条目的视图
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
//将list_item.xml文件找出来并转换成View对象
convertView = View.inflate(MainActivity.this, R.layout.list_item, null);
//找到list_item.xml中创建的TextView
holder = new ViewHolder();
holder.title = convertView.findViewById(R.id.title);
holder.price = convertView.findViewById(R.id.price);
holder.iv = convertView.findViewById(R.id.iv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(titles[position]);
holder.price.setText("价格:" + prices[position]);
holder.iv.setBackgroundResource(icons[position]);
return convertView;
}
class ViewHolder {
TextView title, price;
ImageView iv;
}
}
-
BaseAdapter 核心方法解析:
getCount():返回列表项的总数,决定 ListView 展示多少个条目,项目中返回商品数组的长度;getItem(int position):返回对应位置的数据对象,用于条目点击事件等场景;getItemId(int position):返回对应条目的 ID,通常直接返回 position 作为唯一标识;getView(int position, View convertView, ViewGroup parent):核心方法,负责创建 / 复用列表项视图,将数据绑定到控件。
-
ViewHolder 复用机制:
- 当
convertView == null时,说明没有可复用的视图,需要 inflate 布局、初始化 ViewHolder 并缓存到setTag(); - 当
convertView != null时,直接从getTag()中取出缓存的 ViewHolder,避免重复findViewById,大幅优化列表滑动性能; - ViewHolder 类用于缓存列表项中的控件(TextView、ImageView),减少 findViewById 的耗时,是 ListView 性能优化的核心手段。
- 当
步骤 5:在 Activity 中初始化 ListView 并绑定适配器
最后在 MainActivity 的 onCreate() 方法中,完成 ListView 的初始化与适配器绑定,代码如下:
java
运行
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = findViewById(R.id.lv); //初始化ListView控件
MyBaseAdapter mAdapter = new MyBaseAdapter(); //创建一个Adapter的实例
mListView.setAdapter(mAdapter); //设置Adapter
}
- 首先通过
setContentView加载主布局activity_main.xml; - 通过
findViewById(R.id.lv)初始化 ListView 控件; - 创建自定义适配器
MyBaseAdapter实例,调用mListView.setAdapter(mAdapter)完成数据与视图的绑定; - 运行后即可看到与效果图一致的商品列表,实现完整的列表展示功能。
三、项目中布局资源的详细解析
布局是 Android 界面的灵魂,项目中用到了多种 Android 基础布局,通过布局嵌套实现了复杂的界面结构,下面逐一解析每个布局的作用、用法与核心属性。
3.1 LinearLayout(线性布局)
LinearLayout 是项目中最核心、最常用的布局,分为 ** 垂直(vertical)和水平(horizontal)** 两种方向,通过控件的排列顺序实现界面布局,简单易用,适合初学者。
3.1.1 主布局中的垂直 LinearLayout
主布局 activity_main.xml 的根布局是垂直 LinearLayout,作用是将 “标题栏” 和 “ListView” 按纵向排列,核心属性:
android:orientation="vertical":设置布局为垂直方向,控件从上到下依次排列;android:layout_width="match_parent":布局宽度铺满父容器;android:layout_height="match_parent":布局高度铺满父容器,占满整个屏幕。
3.1.2 列表项中的水平 LinearLayout
列表项 list_item.xml 的根布局是水平 LinearLayout,作用是将 “商品图片” 和 “文字区域” 按横向排列,核心属性:
android:orientation="horizontal":设置布局为水平方向,控件从左到右依次排列;android:padding="16dp":设置布局内边距,让内容与边缘保持间距,提升美观度;android:gravity="center_vertical":设置布局内控件垂直居中,让图片与文字在同一水平线上,避免高低不齐。
3.1.3 文字区域中的垂直 LinearLayout
列表项中文字区域的嵌套布局是垂直 LinearLayout,作用是将 “商品名称” 和 “商品价格” 按纵向排列,核心属性:
android:layout_weight="1":设置布局权重,让文字区域占满水平 LinearLayout 的剩余空间,实现 “图片固定宽度、文字自适应宽度” 的效果;android:layout_marginStart="16dp":设置左边距,让文字与图片保持间距,避免内容拥挤;android:layout_marginBottom="8dp":设置商品名称与价格的间距,提升可读性。
3.2 布局的核心属性与使用技巧
项目中布局的核心属性是实现界面适配与美观的关键,下面总结常用属性的用法:
表格
| 属性名 | 作用 | 项目中的使用场景 |
|---|---|---|
android:layout_width / android:layout_height | 控件的宽度 / 高度,常用值:match_parent(铺满父容器)、wrap_content(自适应内容)、固定 dp 值 | ListView 设为 match_parent,图片设为固定 120dp,文字设为 wrap_content |
android:orientation | LinearLayout 的排列方向,vertical 垂直、horizontal 水平 | 主布局用垂直,列表项用水平 |
android:layout_weight | 权重分配,用于按比例分配父容器的剩余空间 | 文字区域设为 1,实现宽度自适应 |
android:padding / android:layout_margin | 内边距(控件内部与内容的间距)、外边距(控件与其他控件的间距) | 列表项设置 padding,文字区域设置 margin |
android:gravity | 控件内容的对齐方式 | 标题栏设置 center 让文字居中,列表项设置 center_vertical 让控件垂直居中 |
android:scaleType | ImageView 的图片缩放方式 | 图片设为 centerCrop,按比例裁剪,不变形 |
android:divider / android:dividerHeight | ListView 的分割线样式与高度 | 设置灰色分割线,提升列表层次感 |
3.3 布局嵌套的设计逻辑
项目中采用了三级布局嵌套,是 Android 界面开发的经典结构:
plaintext
1. 根布局:垂直 LinearLayout(主界面整体结构:标题栏 + 列表)
2. 列表项根布局:水平 LinearLayout(单个商品结构:图片 + 文字)
3. 文字区域:垂直 LinearLayout(文字结构:名称 + 价格)
这种嵌套结构的优势是:
- 层级清晰,每个布局负责一个独立的界面模块,便于维护与修改;
- 适配性强,通过
match_parent、layout_weight等属性,适配不同尺寸的手机屏幕; - 扩展性强,后续可在任意层级添加新控件(如商品销量、收藏按钮),无需重构整体布局。
四、项目中使用的控件及其详细用法
项目中用到的控件都是 Android 最基础、最核心的常用控件,每个控件都有明确的职责,下面逐一解析每个控件的作用、用法与核心属性。
4.1 ListView(列表控件)
ListView 是项目的核心控件,用于展示垂直滚动的商品列表,是整个项目的功能载体。
核心作用
承载商品列表,实现列表的滑动、复用、数据展示,是项目的核心 UI 组件。
核心属性
android:id="@+id/lv":控件唯一标识,用于在 Activity 中初始化;android:layout_width="match_parent"/android:layout_height="match_parent":铺满屏幕剩余空间;android:divider="@drawable/divider"/android:dividerHeight="1dp":设置列表项分割线,提升界面层次感;android:scrollbars="vertical":设置垂直滚动条(默认开启)。
核心方法
findViewById(R.id.lv):初始化 ListView 控件;setAdapter(adapter):为 ListView 设置适配器,绑定数据与视图;setOnItemClickListener(listener):设置列表项点击事件,实现商品点击跳转详情页等功能。
4.2 TextView(文本显示控件)
TextView 是 Android 最基础的文本显示控件,项目中大量使用,用于展示标题、商品名称、价格等文本内容。
核心作用
显示文本信息,包括标题栏的 “购物商城”、商品名称、商品价格。
核心属性
android:text:设置显示的文本内容;android:textColor:设置文字颜色,标题栏与价格设为白色 / 橙色,商品名称设为黑色;android:textSize:设置文字大小,单位为sp(适配字体大小),标题设为24sp,商品名称设为20sp;android:gravity:设置文字对齐方式,标题栏设为center居中;android:maxLines:设置最大行数,避免文字过多换行(项目中未设置,默认单行显示);android:ellipsize:设置文字超出时的省略方式(如end末尾省略)。
项目中的用法
- 标题栏 TextView:橙色背景、白色文字、居中显示,作为页面标题;
- 商品名称 TextView:黑色文字、大字号,突出商品名称;
- 商品价格 TextView:橙色文字、大字号,突出价格信息,符合电商设计规范。
4.3 ImageView(图片显示控件)
ImageView 用于展示商品图片,是列表项的核心视觉元素。
核心作用
显示商品图片,提升列表的视觉效果,让用户直观了解商品样式。
核心属性
android:id="@+id/iv":控件唯一标识,用于在 Activity 中初始化;android:layout_width/android:layout_height:设置图片大小,项目中设为固定120dp;android:scaleType="centerCrop":按比例裁剪图片,填满 ImageView 区域,保证图片不变形;android:background/android:src:设置图片资源,项目中通过代码动态设置;android:contentDescription="@null":关闭图片内容描述,避免无障碍服务干扰。
核心方法
setBackgroundResource(icons[position]):动态设置图片资源,将商品图片绑定到 ImageView;setImageBitmap(bitmap):设置 Bitmap 格式的图片(用于网络图片加载)。
4.4 View(视图控件)
View 是所有 Android 控件的父类,项目中可用于实现列表项的分割线,替代 ListView 的 divider 属性,实现更灵活的分割线样式。
核心作用
作为分割线,分隔列表项,提升界面层次感。
核心属性
android:layout_width="match_parent":分割线宽度铺满父容器;android:layout_height="1dp":分割线高度,实现细线条效果;android:background="#E0E0E0":分割线颜色,灰色系,不突兀。
五、ListView 与 RecyclerView 核心对比(结合仿今日头条项目)
你之前的仿今日头条项目使用的是 RecyclerView,而本次购物商城项目使用的是 ListView,两者都是 Android 列表控件,但在设计理念、性能、扩展性上有本质差异,下面结合两个项目做详细对比:
5.1 核心架构与复用机制对比
表格
| 特性 | ListView(本次购物商城项目) | RecyclerView(仿今日头条项目) |
|---|---|---|
| 架构设计 | 基于 AbsListView,适配器模式,View 复用依赖手动实现 | 独立控件,强制 ViewHolder 模式,原生支持复用 |
| 复用机制 | 手动通过 convertView + ViewHolder 实现复用,不强制,易写低效代码 | 强制使用 ViewHolder,原生维护复用池,自动复用,性能更强 |
| 布局管理器 | 仅支持垂直列表,布局逻辑写死 | 通过 LayoutManager 灵活切换:垂直列表、水平列表、网格布局、瀑布流 |
| 多布局支持 | 手动在 getView 中判断类型,实现复杂 | 原生支持多布局,通过 getItemViewType 实现,结构清晰 |
| 动画支持 | 无原生动画,需手动实现 | 原生支持条目增删动画,支持自定义动画 |
| 耦合度 | 适配器与 ListView 耦合度高,扩展性差 | 适配器与布局分离,耦合度低,扩展性强 |
5.2 项目实现差异对比
1. 适配器实现差异
- ListView:继承
BaseAdapter,手动处理 convertView 复用,代码冗余,易出错; - RecyclerView:继承
RecyclerView.Adapter,强制 ViewHolder,代码结构清晰,复用逻辑由系统维护。
2. 多布局实现差异
- ListView:在
getView中手动判断条目类型,加载不同布局,代码混乱,扩展性差; - RecyclerView:通过
getItemViewType返回类型,onCreateViewHolder加载对应布局,结构清晰,易于维护(仿今日头条项目的单图 / 三图布局就是通过该方式实现)。
3. 性能差异
- ListView:手动复用,若未使用 ViewHolder,会导致大量
findViewById,滑动卡顿,内存占用高; - RecyclerView:强制复用,滑动流畅,内存占用低,适合大量数据展示(如资讯类 App 的长列表)。
5.3 适用场景对比
- ListView:适合简单列表、少量数据、快速开发的入门项目(如本次购物商城项目),代码简单,易上手;
- RecyclerView:适合复杂列表、大量数据、多布局、需要动画 / 拖拽的项目(如仿今日头条、电商 App 商品列表),是目前 Android 开发的主流列表控件。
六、项目优化方案与可扩展方向
6.1 ListView 性能优化方案
虽然 ListView 是老旧控件,但仍可通过优化提升性能,适配更多场景:
- 优化 ViewHolder 复用:项目中已经实现 ViewHolder 复用,这是 ListView 最核心的优化手段,避免重复
findViewById; - 异步加载图片:项目中使用本地图片,若加载网络图片,需使用异步线程(如 AsyncTask、Glide),避免主线程阻塞;
- 复用 convertView:确保
getView中正确处理convertView,避免每次都 inflate 布局; - 减少布局层级:将列表项的嵌套 LinearLayout 替换为
ConstraintLayout,减少布局层级,提升渲染速度; - 设置 ListView 固定大小:
mListView.setHasFixedSize(true),避免 ListView 重新测量,提升滑动性能。
6.2 项目功能扩展方向
基于当前购物商城项目,可扩展更多实用功能,逐步从入门项目升级为完整电商模块:
- 添加列表项点击事件:为 ListView 设置
setOnItemClickListener,点击商品跳转到商品详情页; - 实现网格布局切换:将 ListView 替换为 RecyclerView,通过
GridLayoutManager实现商品列表的网格展示; - 添加网络数据加载:使用 Retrofit/OkHttp 从服务器获取商品数据,替代本地数组;
- 添加图片加载框架:使用 Glide/Picasso 加载网络图片,实现图片缓存、圆角、淡入动画等效果;
- 添加筛选与搜索功能:在标题栏添加搜索框,实现商品搜索、价格筛选等功能;
- 添加下拉刷新与上拉加载:使用 SwipeRefreshLayout 实现下拉刷新,加载更多商品数据;
- 添加购物车功能:为商品添加 “加入购物车” 按钮,实现购物车数据存储与展示;
- 优化界面样式:添加商品圆角、阴影、水波纹点击效果,提升界面美观度。
前言
在 Android 开发的演进历程中,列表控件始终是构建信息展示类 App 的核心基石。从早期的 ListView 到如今的 RecyclerView,列表控件的性能、扩展性与灵活性实现了质的飞跃,成为资讯、电商、社交等各类 App 不可或缺的核心组件。本次我们以一个动物信息展示的 RecyclerView 项目为核心,结合之前的 ListView 购物商城、仿今日头条项目,完整拆解 RecyclerView 的使用流程、项目中的布局资源、控件用法,以及 RecyclerView 相较于 ListView 的核心优势。本文全程围绕项目代码与运行效果图展开,从基础原理到实战实现,从布局搭建到代码优化,为 Android 初学者提供一份可直接落地、可深度拓展的 RecyclerView 实战指南,全文约 6000 字,覆盖 RecyclerView 开发的全流程核心知识点。
一、项目概述与界面结构拆解
1.1 项目背景与功能定位
本次动物信息展示项目是 Android 入门级经典实战案例,核心目标是通过 RecyclerView 实现动物信息列表的展示,还原资讯类 App 信息流的基础样式。项目最终运行效果如图所示:
- 顶部为深绿色标题栏,显示 “RecyclerView” 标题;
- 主体为纵向滚动的动物列表,每个列表项(Item)包含动物图片、动物名称、动物介绍三个核心元素;
- 列表项样式统一,图片居左、文字居右,名称以橙色高亮显示,介绍以灰色常规字体展示,符合资讯类 App 的视觉设计规范;
- 列表支持纵向滑动,可完整展示 5 个动物条目,滑动流畅无卡顿,界面布局规整,完美适配手机屏幕尺寸。
该项目的核心技术点是 RecyclerView 控件的使用 + 自定义 Adapter 适配器 + 多控件布局实现,同时覆盖了 Android 基础布局、常用控件的实战用法,是学习 Android 列表开发的经典入门案例,也是仿今日头条等资讯类 App 列表实现的标准原型。
1.2 项目核心代码结构
项目的核心代码位于 cn.edu.recyclerview 包下的 MainActivity.java,同时包含两个核心布局文件,完整结构如下:
plaintext
app/src/main/
├── java/cn/edu/recyclerview/
│ └── MainActivity.java # 核心业务代码,RecyclerView 逻辑实现
├── res/
│ ├── layout/
│ │ ├── activity_main.xml # 主布局,承载 RecyclerView 控件
│ │ └── recycler_item.xml # 列表项布局,定义每个动物的展示样式
│ ├── drawable/ # 动物图片资源(cat、siberianhusky 等)
│ └── values/ # 字符串、颜色、尺寸等配置文件
└── AndroidManifest.xml # 应用清单文件,声明 Activity
其中,MainActivity.java 是项目的逻辑中枢,负责 RecyclerView 初始化、数据准备、适配器绑定;两个布局文件是界面的视觉核心,定义了列表的整体结构与每个动物项的展示样式;drawable 目录存放动物图片资源,为列表提供视觉内容。
二、RecyclerView 核心原理与项目中的完整使用流程
2.1 RecyclerView 基础原理概述
RecyclerView 是 Android 5.0 推出的新一代列表控件,是 ListView 的全面升级替代方案,其核心设计理念是 “架构解耦、性能优化、高度扩展” ,核心工作原理同样基于 MVC 模式:
- Model(数据层) :项目中的动物名称、介绍、图片等数据,以数组形式存储;
- View(视图层) :
activity_main.xml(列表容器)和recycler_item.xml(列表项布局),负责界面渲染; - Controller(控制层) :
HomeAdapter适配器,作为数据与视图的桥梁,负责将数据绑定到列表项,实现数据的展示与复用。
相较于 ListView,RecyclerView 的核心优势在于:强制 ViewHolder 复用机制、灵活的 LayoutManager 布局管理、原生支持多布局与动画、解耦的架构设计,彻底解决了 ListView 性能差、扩展性弱的痛点,成为目前 Android 列表开发的唯一标准选择。
2.2 RecyclerView 在项目中的完整使用步骤
结合项目代码,RecyclerView 的使用可分为 5 个标准步骤,每个步骤环环相扣,缺一不可:
步骤 1:在主布局中声明 RecyclerView 控件
首先需要在 activity_main.xml 中添加 RecyclerView 控件,作为动物列表的容器,代码如下:
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 顶部标题栏 -->
<TextView
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="#009688"
android:text="RecyclerView"
android:textColor="#FFFFFF"
android:textSize="24sp"
android:gravity="center_vertical"
android:paddingStart="16dp"/>
<!-- RecyclerView 列表容器 -->
<android.support.v7.widget.RecyclerView
android:id="@+id/id_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
- 外层使用垂直
LinearLayout,实现 “标题栏 + 列表” 的纵向布局结构; - RecyclerView 的
id为id_recyclerview,用于在 Activity 中通过findViewById初始化; layout_width和layout_height设为match_parent,让 RecyclerView 铺满屏幕剩余空间,适配不同尺寸的手机屏幕;- 标题栏使用深绿色背景,与效果图视觉风格完全一致,突出页面主题。
步骤 2:创建列表项布局(recycler_item.xml)
列表项布局定义了每个动物条目的展示样式,是用户看到的核心视觉内容,项目中采用 “左图右文” 的经典资讯布局,代码如下:
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:gravity="center_vertical">
<!-- 动物图片 -->
<ImageView
android:id="@+id/iv"
android:layout_width="120dp"
android:layout_height="120dp"
android:scaleType="centerCrop"
android:contentDescription="@null"/>
<!-- 文字区域(垂直排列) -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="16dp"
android:orientation="vertical">
<!-- 动物名称 -->
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="动物名称"
android:textColor="#FF9800"
android:textSize="20sp"
android:layout_marginBottom="8dp"/>
<!-- 动物介绍 -->
<TextView
android:id="@+id/introduce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="动物介绍"
android:textColor="#666666"
android:textSize="16sp"
android:lineSpacingExtra="4dp"
android:maxLines="3"
android:ellipsize="end"/>
</LinearLayout>
</LinearLayout>
- 外层使用水平
LinearLayout,实现 “图片居左、文字居右” 的布局; ImageView用于展示动物图片,scaleType="centerCrop"保证图片按比例裁剪,不变形,完美适配 120dp×120dp 的固定尺寸;- 文字区域使用垂直
LinearLayout,通过layout_weight="1"让文字区域占满剩余空间,适配不同屏幕宽度; - 名称
TextView设置橙色文字,突出标题信息;介绍TextView设置灰色文字,常规字号,添加行间距与最大行数限制,避免内容过长影响布局,符合资讯类 App 设计规范; padding和margin属性用于调整控件间距,提升界面美观度,避免内容拥挤。
步骤 3:准备数据源
在 MainActivity.java 中定义动物数据,包括动物名称、介绍、图片资源 ID,代码如下:
java
运行
private String[] names = {"小猫", "哈士奇", "小黄鸭", "小鹿", "老虎"};
private int[] icons = {R.drawable.cat, R.drawable.siberianhusky,
R.drawable.yellowduck, R.drawable.fawn, R.drawable.tiger};
private String[] introduces = {
"猫,属于猫科动物,分家猫、野猫,是全世界家庭中较为广泛的宠物。",
"西伯利亚雪橇犬,常见别名哈士奇,昵称为二哈。",
"鸭的体型相对较小,颈短,一些属的嘴要大些。腿位于身体后方,因而步态蹒跚。",
"鹿科是哺乳纲偶蹄目下的一科动物。体型大小不等,为有角的反刍类。",
"虎,大型猫科动物;毛色浅黄或棕黄色,满有黑色横纹;头圆、耳短,耳背面黑色,中央有一白斑甚显著;四肢健壮有力;尾粗长,具黑色环纹,尾端黑色。"
};
- 三个数组一一对应,
names[i]、introduces[i]、icons[i]对应第i个动物的完整信息; - 图片资源以
R.drawable.xxx的形式存储,对应drawable目录下的图片文件; - 数据量设置为 5 条,覆盖不同类型动物(宠物、家畜、野生动物),验证列表的展示效果,与效果图完全匹配。
步骤 4:自定义 RecyclerView.Adapter 适配器
适配器是 RecyclerView 的核心,负责将数据与布局绑定,实现列表项的渲染与复用。项目中继承 RecyclerView.Adapter 自定义适配器,核心代码如下:
java
运行
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(
R.layout.recycler_item, parent, false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.name.setText(names[position]);
holder.iv.setImageResource(icons[position]);
holder.introduce.setText(introduces[position]);
}
@Override
public int getItemCount() {
return names.length;
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView name;
ImageView iv;
TextView introduce;
public MyViewHolder(View view) {
super(view);
name = view.findViewById(R.id.name);
iv = view.findViewById(R.id.iv);
introduce = view.findViewById(R.id.introduce);
}
}
}
-
RecyclerView.Adapter 核心方法解析:
onCreateViewHolder(ViewGroup parent, int viewType):核心方法,负责创建 ViewHolder 实例,inflate 列表项布局recycler_item.xml,仅在列表首次加载、需要新视图时调用,避免重复 inflate 布局;onBindViewHolder(MyViewHolder holder, int position):核心方法,负责将数据绑定到 ViewHolder 中的控件,列表滑动时会反复调用,实现数据的复用与更新;getItemCount():返回列表项的总数,决定 RecyclerView 展示多少个条目,项目中返回动物名称数组的长度;
-
ViewHolder 强制复用机制:
- RecyclerView 强制要求使用 ViewHolder 类,在
onCreateViewHolder中一次性完成所有控件的findViewById并缓存; - 后续滑动时直接复用缓存的 ViewHolder,彻底避免了 ListView 中重复
findViewById的性能问题,大幅提升列表滑动流畅度; - ViewHolder 继承自
RecyclerView.ViewHolder,在构造方法中完成控件初始化,结构清晰,职责明确。
- RecyclerView 强制要求使用 ViewHolder 类,在
步骤 5:在 Activity 中初始化 RecyclerView 并绑定适配器
最后在 MainActivity 的 onCreate() 方法中,完成 RecyclerView 的初始化与适配器绑定,代码如下:
java
运行
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.id_recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new HomeAdapter();
mRecyclerView.setAdapter(mAdapter);
}
- 首先通过
setContentView加载主布局activity_main.xml; - 通过
findViewById(R.id.id_recyclerview)初始化 RecyclerView 控件; - 关键步骤:为 RecyclerView 设置
LinearLayoutManager,这是 RecyclerView 的布局管理器,负责控制列表的排列方式(垂直 / 水平 / 网格 / 瀑布流),项目中使用默认的垂直线性布局,实现纵向滚动列表; - 创建自定义适配器
HomeAdapter实例,调用mRecyclerView.setAdapter(mAdapter)完成数据与视图的绑定; - 运行后即可看到与效果图一致的动物列表,实现完整的列表展示功能。
三、项目中布局资源的详细解析
布局是 Android 界面的灵魂,项目中用到了多种 Android 基础布局,通过布局嵌套实现了复杂的界面结构,下面逐一解析每个布局的作用、用法与核心属性。
3.1 LinearLayout(线性布局)
LinearLayout 是项目中最核心、最常用的布局,分为 ** 垂直(vertical)和水平(horizontal)** 两种方向,通过控件的排列顺序实现界面布局,简单易用,适合初学者。
3.1.1 主布局中的垂直 LinearLayout
主布局 activity_main.xml 的根布局是垂直 LinearLayout,作用是将 “标题栏” 和 “RecyclerView” 按纵向排列,核心属性:
android:orientation="vertical":设置布局为垂直方向,控件从上到下依次排列;android:layout_width="match_parent":布局宽度铺满父容器;android:layout_height="match_parent":布局高度铺满父容器,占满整个屏幕。
3.1.2 列表项中的水平 LinearLayout
列表项 recycler_item.xml 的根布局是水平 LinearLayout,作用是将 “动物图片” 和 “文字区域” 按横向排列,核心属性:
android:orientation="horizontal":设置布局为水平方向,控件从左到右依次排列;android:padding="16dp":设置布局内边距,让内容与边缘保持间距,提升美观度;android:gravity="center_vertical":设置布局内控件垂直居中,让图片与文字在同一水平线上,避免高低不齐。
3.1.3 文字区域中的垂直 LinearLayout
列表项中文字区域的嵌套布局是垂直 LinearLayout,作用是将 “动物名称” 和 “动物介绍” 按纵向排列,核心属性:
android:layout_weight="1":设置布局权重,让文字区域占满水平 LinearLayout 的剩余空间,实现 “图片固定宽度、文字自适应宽度” 的效果;android:layout_marginStart="16dp":设置左边距,让文字与图片保持间距,避免内容拥挤;android:layout_marginBottom="8dp":设置动物名称与介绍的间距,提升可读性。
3.2 布局的核心属性与使用技巧
项目中布局的核心属性是实现界面适配与美观的关键,下面总结常用属性的用法:
表格
| 属性名 | 作用 | 项目中的使用场景 |
|---|---|---|
android:layout_width / android:layout_height | 控件的宽度 / 高度,常用值:match_parent(铺满父容器)、wrap_content(自适应内容)、固定 dp 值 | RecyclerView 设为 match_parent,图片设为固定 120dp,文字设为 wrap_content |
android:orientation | LinearLayout 的排列方向,vertical 垂直、horizontal 水平 | 主布局用垂直,列表项用水平 |
android:layout_weight | 权重分配,用于按比例分配父容器的剩余空间 | 文字区域设为 1,实现宽度自适应 |
android:padding / android:layout_margin | 内边距(控件内部与内容的间距)、外边距(控件与其他控件的间距) | 列表项设置 padding,文字区域设置 margin |
android:gravity | 控件内容的对齐方式 | 标题栏设置 center_vertical 让文字居中,列表项设置 center_vertical 让控件垂直居中 |
android:scaleType | ImageView 的图片缩放方式 | 图片设为 centerCrop,按比例裁剪,不变形 |
android:lineSpacingExtra | TextView 的行间距,单位为 dp | 介绍文字设置 4dp 行间距,提升可读性 |
android:maxLines / android:ellipsize | TextView 的最大行数与超出省略方式 | 介绍文字设为 maxLines="3"、ellipsize="end",避免内容过长 |
3.3 布局嵌套的设计逻辑
项目中采用了三级布局嵌套,是 Android 界面开发的经典结构:
plaintext
1. 根布局:垂直 LinearLayout(主界面整体结构:标题栏 + 列表)
2. 列表项根布局:水平 LinearLayout(单个动物结构:图片 + 文字)
3. 文字区域:垂直 LinearLayout(文字结构:名称 + 介绍)
这种嵌套结构的优势是:
- 层级清晰,每个布局负责一个独立的界面模块,便于维护与修改;
- 适配性强,通过
match_parent、layout_weight等属性,适配不同尺寸的手机屏幕; - 扩展性强,后续可在任意层级添加新控件(如动物分类、收藏按钮),无需重构整体布局。
四、项目中使用的控件及其详细用法
项目中用到的控件都是 Android 最基础、最核心的常用控件,每个控件都有明确的职责,下面逐一解析每个控件的作用、用法与核心属性。
4.1 RecyclerView(列表控件)
RecyclerView 是项目的核心控件,用于展示垂直滚动的动物列表,是整个项目的功能载体,也是 ListView 的全面升级替代方案。
核心作用
承载动物列表,实现列表的滑动、复用、数据展示,支持灵活的布局管理与扩展,是目前 Android 列表开发的标准选择。
核心属性
android:id="@+id/id_recyclerview":控件唯一标识,用于在 Activity 中初始化;android:layout_width="match_parent"/android:layout_height="match_parent":铺满屏幕剩余空间;android:scrollbars="vertical":设置垂直滚动条(默认开启)。
核心方法
findViewById(R.id.id_recyclerview):初始化 RecyclerView 控件;setLayoutManager(layoutManager):为 RecyclerView 设置布局管理器,控制列表排列方式;setAdapter(adapter):为 RecyclerView 设置适配器,绑定数据与视图;setOnItemClickListener(listener):设置列表项点击事件,实现动物点击跳转详情页等功能;notifyDataSetChanged():通知适配器数据更新,刷新列表。
4.2 TextView(文本显示控件)
TextView 是 Android 最基础的文本显示控件,项目中大量使用,用于展示标题、动物名称、介绍等文本内容。
核心作用
显示文本信息,包括标题栏的 “RecyclerView”、动物名称、动物介绍。
核心属性
android:text:设置显示的文本内容;android:textColor:设置文字颜色,标题栏设为白色,名称设为橙色,介绍设为灰色;android:textSize:设置文字大小,单位为sp(适配字体大小),标题设为24sp,名称设为20sp,介绍设为16sp;android:gravity:设置文字对齐方式,标题栏设为center_vertical居中;android:maxLines:设置最大行数,介绍文字设为3,避免内容过多换行;android:ellipsize="end":设置文字超出时末尾显示省略号,优化界面展示;android:lineSpacingExtra:设置行间距,介绍文字设为4dp,提升可读性。
项目中的用法
- 标题栏 TextView:深绿色背景、白色文字、居中显示,作为页面标题;
- 动物名称 TextView:橙色文字、大字号,突出标题信息;
- 动物介绍 TextView:灰色文字、常规字号,展示详细信息,符合资讯类 App 设计规范。
4.3 ImageView(图片显示控件)
ImageView 用于展示动物图片,是列表项的核心视觉元素。
核心作用
显示动物图片,提升列表的视觉效果,让用户直观了解动物样式。
核心属性
android:id="@+id/iv":控件唯一标识,用于在 Activity 中初始化;android:layout_width/android:layout_height:设置图片大小,项目中设为固定120dp;android:scaleType="centerCrop":按比例裁剪图片,填满 ImageView 区域,保证图片不变形;android:contentDescription="@null":关闭图片内容描述,避免无障碍服务干扰。
核心方法
setImageResource(icons[position]):动态设置图片资源,将动物图片绑定到 ImageView;setImageBitmap(bitmap):设置 Bitmap 格式的图片(用于网络图片加载);setScaleType(scaleType):动态设置图片缩放方式。
4.4 LayoutManager(布局管理器)
LayoutManager 是 RecyclerView 的核心扩展组件,是 RecyclerView 相较于 ListView 的核心优势之一,负责控制列表的排列方式。
核心作用
为 RecyclerView 提供灵活的布局方式,无需修改适配器与数据,即可切换列表样式。
项目中的用法
项目中使用 LinearLayoutManager,实现垂直线性列表,是最常用的布局管理器:
java
运行
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
常用布局管理器类型
LinearLayoutManager:线性布局,支持垂直 / 水平列表,是项目中使用的类型;GridLayoutManager:网格布局,可实现 2 列 / 3 列的网格列表;StaggeredGridLayoutManager:瀑布流布局,可实现不规则高度的 staggered 列表;FlexboxLayoutManager:弹性布局,适合不规则尺寸的列表项。