Android列表三剑客:ListView、AbsListView 、AdapterView

0 阅读1分钟

一、继承体系与整体结构关系

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 解耦数据,用复用机制保证性能