![eb42f8e767ea66e5cd9f66bfa7eae4b3.png](https://i-blog.csdnimg.cn/blog_migrate/a7117a6ab81046196697570d316c3a25.jpeg)
image
![6b95e0fa85851b8be9a6d7a537bd650d.png](https://i-blog.csdnimg.cn/blog_migrate/d783ccf26ef466b492b3fdab722c8f73.jpeg)
前言介绍:
关于 ListView
我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView
的使用方法,和一些需要优化注意的地方,还有日常开发过程中的一些小技巧和经验。
ListView 简介
ListView
是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView
。
类的关系图:
[图片上传失败...(image-2ce24b-1566899080667)]
表现形式
![7f3fe4de3068592d764606d582a3733b.png](https://i-blog.csdnimg.cn/blog_migrate/6776d0360a676f7a66f939fa4327aca6.jpeg)
image
这就是一种最简单的 ListView
的表现形式,黑色框就是 ListView
控件,其中由一个个的 item
组成(红色框内容),然后可以通过向下滑动来查看很多的条目。
工作原理
ListView
仅是作为容器(列表),用于装载显示数据(就是上面的一个个的红色框的内容,也称为 item)。item 中的具体数据是由适配器(adapter)来提供的。
适配器(adapter):作为 View (不仅仅指的 ListView)和数据之间的桥梁或者中介,将数据映射到要展示的 View 中。这就是最简单适配器模式,也是适配器的主要作用!
当需要显示数据的时候,ListView 会从适配器(Adapter)中取出数据,然后来加载数据。
![4ac743dee4bd8ebf7cf35c05af0d57ba.png](https://i-blog.csdnimg.cn/blog_migrate/e6c0ffe7c37fc98010f66d94514d701f.jpeg)
image
ListView 负责以列表的形式向我们展示 Adapter 提供的内容
缓存原理
前面讲了 ListView 负责把 Adapter 提供的内容一一的展现出来,每一条数据对应一个 item 。试想如果把所有的数据信息全部加载到 ListView 上显示,加入这些数据有 100 条。那么 ListView 就要创建 100 个视图。如果有更多的数据,那么 ListView 就会创建更多的视图。这种行为显然是不可取的,这样会消耗大量的内容。
解决方案:
为了节省内存的占用,ListView 是不会为每一条数据创建一个视图的,而是采用了 Recycler组件 的方式。回收和复用 View。
那么是如何来复用的呢?
我们都知道一个屏幕可见的内容就是那么大,所以用户一次能看到的 item 就是固定的那么几个。假如当屏幕一次可以显示 x 个 item 时(不用是完整的),那么 ListView 会创建 x+1 个视图;当第1个 item 离开屏幕的时候,此时这个 item 的 View 就会被回收,再入屏的 item 的 View 就会优先从该缓存中获取。
只有 item 完全离开屏幕后才会复用,这也是为什么 ListView 要创建比屏幕需要显示视图多 1 个的原因:缓冲显示视图。
第 1 个 item 离开屏幕是有一个过程的,会有 1 个 第一个 item 的下半部分 & 第 X+1 个 item 的上半部分同时在屏幕中显示的状态 这种情况是没法使用缓存的 View 的。只能继续用新创建的视图 View。
实例演示:
假如屏幕一次只能显示 5 个 item,那么 ListView 会创建 (5+1)个 item 视图;当第 1 个 item 完全离开屏幕后才会回收至缓存,从而复用。(用于显示第 7 个 item)。
演示图来自网络:
![bc66ae2dab33d41500ae60c0c44f1c68.png](https://i-blog.csdnimg.cn/blog_migrate/7620e4b303d47bd467a887186f229a2a.jpeg)
image
具体使用
引入 ListView 和普通的 View 一样,直接在布局中添加 ListView
控件即可。
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"