一、继承体系与整体结构关系
1. Android UI 中的层级关系
在 Android 视图体系中,三者的继承关系如下(省略无关分支):
View
└── ViewGroup
└── AdapterView<T extends Adapter>
└── AbsListView
└── ListView
2. 各层职责划分(自上而下)
类
核心职责
AdapterView
建立 数据(Adapter)与子 View 的连接规范
AbsListView
实现 **可滚动列表的通用机制**(触摸、复用、选择)
ListView
提供 垂直线性列表 的具体实现
👉 **设计思想**:
抽象公共能力 → 复用通用逻辑 → 最小化具体实现
二、AdapterView 与 AbsListView 的协作机制
1. AdapterView:数据与视图的桥梁
核心设计目标
-
解耦 数据源 与 UI 容器
-
通过
Adapter统一数据访问方式
关键成员
Adapter mAdapter;
关键方法
-
setAdapter(Adapter adapter) -
getItemAtPosition(int position) -
getCount()
📌 AdapterView 本身并不负责:
-
子 View 的复用
-
滚动
-
布局策略
它只定义了 **“数据转变为View的接口”**。
2. AbsListView:列表通用行为的核心实现
AbsListView 在 AdapterView 的基础上,引入了**列表控件的灵魂机制**。
它解决了什么问题?
✅ 视图复用
✅ 滚动与触摸处理
✅ 选择状态管理
✅ 高性能绘制
✅ View 回收池(RecycleBin)
关键字段示意
RecycleBin mRecycler;
int mFirstPosition;
核心职责总结
AbsListView = 通用“可滚动列表引擎”
3. 两者的协作关系
AdapterView
└── 定义数据访问规范
AbsListView
└── 控制:
- 何时创建 View
- 何时复用 View
- 如何滚动和回收
AdapterView 提供“数据”,AbsListView 决定“怎么用这些数据生成和管理 View”。
三、ListView 的使用方式与性能优化
1. ListView 的典型使用场景
-
垂直滚动的线性列表
-
数据量中等、结构相对固定
-
传统信息展示类页面(设置、列表页)
2. 基本使用流程
ListView listView = findViewById(R.id.listView);
listView.setAdapter(adapter);
Adapter 中最核心的方法:
View getView(int position, View convertView, ViewGroup parent)
3. 常用 API
方法
说明
setAdapter()
绑定数据源
setOnItemClickListener()
条目点击
setSelection()
滚动到指定位置
smoothScrollToPosition()
平滑滚动
4. 性能优化策略(非常重要)
✅ View 复用(convertView)
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, parent, false);
}
✅ ViewHolder 模式(避免重复 findViewById)
static class ViewHolder {
TextView title;
}
✅ 减少布局层级
-
避免嵌套过深的
LinearLayout -
使用
ConstraintLayout/ 扁平布局
✅ 避免在 getView() 中做耗时操作
-
不要直接加载图片
-
不要做 IO / 复杂计算
四、ListView 的复用与回收机制(核心原理)
1. 为什么必须复用?
假设屏幕一次只能显示 **10 个 item**:
-
数据 1000 条
-
不复用 → 创建 1000 个 View
-
复用 → 始终只维护 **
10**15 个 View
✅ 节省内存
✅ 提升滑动流畅度
2. RecycleBin 工作原理
AbsListView 内部维护一个 **回收池**:
RecycleBin
├── Active Views(屏幕可见)
└── Scrap Views(滑出屏幕,可复用)
3. getView() 的完整流程(简化版)
用户滚动
↓
AbsListView 判断新位置需要显示
↓
从 RecycleBin 取 convertView
↓
调用 Adapter.getView(position, convertView)
↓
Adapter 绑定新数据
↓
View 显示到屏幕
关键点:
-
convertView != null表示可复用 -
Adapter 负责 数据重绑定
-
ListView 负责 生命周期管理
4. 多布局类型的复用(重要细节)
getViewTypeCount()
getItemViewType(position)
👉 同一类型的 View 才能互相复用
👉 否则会造成错位或异常
五、ListView 的演进与地位变化
1. ListView 的历史定位
-
早期 Android 唯一主流列表方案
-
API 简单、上手快
-
满足基础列表需求
2. 局限性逐渐显现
问题
表现
布局能力有限
仅支持线性
扩展性差
动画、组合困难
复用逻辑固定
不够灵活
易出错
ViewHolder、类型管理复杂
3. RecyclerView 的出现与替代关系
对比项
ListView
RecyclerView
复用机制
内部自动
显式 ViewHolder
布局方式
垂直线性
线性 / 网格 / 瀑布流
动画支持
基本不支持
原生支持
扩展性
较弱
极强
✅ 现代 Android 推荐 RecyclerView
✅ ListView 仍用于维护旧项目或简单场景
六、总结(一句话理解)
-
AdapterView:定义“数据如何提供”
-
AbsListView:实现“列表如何高效滚动和复用”
-
ListView:具体的“垂直列表实现”
-
设计精髓:> 用 Adapter 解耦数据,用复用机制保证性能