认识ListView
# 1. ListView理解
ListView是一种用来 显示多个可滑动项『item』列表 的 ViewGroup
显示列表:mListView.setAdapter(adapter)
需要使用 Adapter 将 集合数据 和每一个 item所对应的布局 动态适配至ListView中显示
ListView继承关系
ArrayAdapter、SimpleAdapter、SimpleCursorAdapter也是继承自BaseAdapter
Adapter
- BaseAdapter:显示复杂的列表,集合数据可以是任意类型
List<Xxx>
- ArrayAdapter:显示文本列表,集合数据为
List<String>
或String[]
- SimpleAdapter:显示复杂列表,数据集合必须是
List<Map<String,Object>>
类型 - SimpleCursorAdapter:显示复杂类表,集合数据是数据库查询的结果集
# 常用属性
属性名称 | 说明 |
---|---|
divider | 设置 分割线 的颜色 |
dividerHeight | 设置 分割线 的高度 |
scrollbars | 设置 滚动条 的隐藏或显示 |
fadeScrollbars | 设置 滚动条 的自动隐藏或显示 |
entries | 引用一个将使用在此ListView里的数组。若数组是固定的,使用此属性将比在程序中写入更为简单 |
# 2. ListView工作原理
# 本质原理
ListView
仅作为容器(列表),用于 装载 & 显示数据(即列表项item
)- 而容器内的具体数据(列表项
item
)则是由 适配器(Adapter
)提供
适配器(Adapter):作为
View
和 数据 之间的桥梁中介,将数据映射到要展示的View
中
- 当需显示数据时,
ListView
会向Adapter
取出数据,从而加载显示,具体如下图
结论:ListView
负责以列表的形式显示Adapter
提供的内容
# 缓存原理
试想一个场景:若把所有数据集合的信息都加载到
ListView
上显示,若ListView
要为每个数据都创建一个视图,那么会占用非常多的内存
- 为了节省空间和时间,
ListView
不会为每一个数据创建一个视图,而是采用了Recycler组件,用于回收 & 复用View
- 当屏幕需显示
x
个Item
时,那么ListView
会创建x+1
个视图;当第1个Item
离开屏幕时,此Item
的View
被回收至缓存,入屏的Item
的View
会优先从该缓存中获取
注意:
- 只有
Item
完全离开屏幕后才可复用,这也是为什么ListView
要创建比屏幕需显示视图多1个的原因:缓冲 显示视图- 即:第1个
Item
离开屏幕是有过程的,会有1个 第1个Item
的下半部分 & 第8个Item
上半部分同时在屏幕中显示的状态,此时仍无法使用缓存的View
,只能继续用新创建的视图View
- 实例演示
设:屏幕只能显示5个
Item
,那么ListView
只会创建(5+1)个Item
的视图;当第1个Item
完全离开屏幕后才会回收至缓存从而复用(用于显示第7个Item
)
# 3. ListView的基本属性
# 生成方式
生成列表视图(ListView)的方式主要有两种:
- 直接用ListView进行创建
- 让Activity继承ListActivity
# xml文件配置信息
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFE1FF"
android:orientation="vertical" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
AbsListView的常用属性和相关方法:
属性 | 说明 | 备注 |
---|---|---|
android:choiceMode | 列表的选择行为,默认:none没有选择行为 | 选择方式: none:不显示任何选中项 singleChoice:允许单选multipleChoice:允许多选multipleChoiceModal:允许多选 (把Activity里面adapter的第二个参数改成支持选择的布局) |
android:drawSelectorOnTop | 如果该属性设置为true,选中的列表项将会显示在上面 | |
android:listSelector | 为点击到的Item设置图片 | 如果该属性设置为true,选中的列表项将会显示在上面 |
android:fastScrollEnabled | 设置是否允许快速滚动 | 如果该属性设置为true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动。 |
android:listSelector | 指定被选中的列表项上绘制的Drawable | |
android:scrollingCache | 滚动时是否使用缓存 | 如果设置为true,则在滚动时将会使用缓存 |
android:stackFromBottom | 设置是否从底端开始排列列表项 | |
android:transcriptMode | 指定列表添加新的选项的时候,是否自动滑动到底部,显示新的选项。 | disabled:取消transcriptMode模式;默认的normal:当接受到数据集合改变的通知,并且仅仅当最后一个选项已经显示在屏幕的时候,自动滑动到底部。 alwaysScroll:无论当前列表显示什么选项,列表将会自动滑动到底部显示最新的选项。 |
Listview提供的XML属性:
XML属性 | 说明 | 备注 |
---|---|---|
android:divider | 设置List列表项的分隔条(可用颜色分割,也可用图片(Drawable)分割 | 不设置列表之间的分割线,可设置属性为@null |
android:dividerHeight | 用于设置分隔条的高度 | |
android:background属性 | 设置列表的背景 | |
android:entries | 指定一个数组资源,Android将根据该数组资源来生成ListView | |
android:footerDividerEnabled | 如果设置成false,则不在footer View之前绘制分隔条 | |
andorid:headerDividerEnabled | 如果设置成false,则不再header View之前绘制分隔条 |
[1]Carson_Ho.Android:ListView与AdapterView全面解析[EB/OL].https://www.jianshu.com/p/4e8e4fd13cf7.
编辑 (opens new window)
上次更新: 2021/06/02, 10:01:48