前言介绍:

关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日常开发过程中的一些小技巧和经验。

ListView 简介

ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView。

类的关系图:

表现形式

这就是一种最简单的 ListView 的表现形式,黑色框就是 ListView 控件,其中由一个个的 item 组成(红色框内容),然后可以通过向下滑动来查看很多的条目。

工作原理

ListView 仅是作为容器(列表),用于装载显示数据(就是上面的一个个的红色框的内容,也称为 item)。item 中的具体数据是由适配器(adapter)来提供的。

适配器(adapter):作为 View (不仅仅指的 ListView)和数据之间的桥梁或者中介,将数据映射到要展示的 View 中。这就是最简单适配器模式,也是适配器的主要作用!

当需要显示数据的时候,ListView 会从适配器(Adapter)中取出数据,然后来加载数据。

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)。

演示图来自网络:

具体使用

引入 ListView 和普通的 View 一样,直接在布局中添加 ListView 控件即可。

xml 中文件配置信息

AbsListView 常用属性和相关方法:

属性 说明 备注 android:choiceMode 列表的选择行为:默认:none 没有选择行为 选择方式:none:不显示任何选中项目 singleChoice:允许单选

multipleChoiceModel:允许多选

配合 getCheckedItemPosition 、getCheckedItemCount、等使用 android:drawSelectorOnTop 如果该属性设置为 true,选中的列表项的选中颜色会 成为前景颜色(实验没有效果) 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 则不在 footerView 之前绘制分隔条 android:headerDividerEnabled 如果设置成 false 则不再 headerView 之前绘制分隔条 Adapter 简介

使用 ListView 的话就离不开 Adapter 了。

Adapter 本身是一个接口,Adapter 接口及其子类的继承关系如下图:

  • Adapter 接口派生了 ListAdapter 和 SpinnerAdapter 两个子接口

其中 ListAdapter 为 AbsAdapter 提供列表项,SpinnerAdapter 为 AbsSpinner 提供列表项

ArrayAdapter 、SimpleAdapter 都是 Android API 给我们提供好的适配器,直接使用即可,不过模式都已经写死了。

  • ArrayAdapter:简单、易用的 Adapter,用于将数组数据作为数据源绑定到列表项中。支持泛型操作
  • SimpleAdapter:相比 ArrayAdapter 来说,功能比较强大,可以将数据源的数据一一的绑定到 item 中的 view 中。
  • CursorAdapter:用于绑定游标(直接从数据库取出数据)作为列表项的数据源,和数据库有关系,不常用。
  • BaseAdapter:这个是我们在实际开发中经常用到的,我们需要继承 BaseAdapter 来自定义我们自己的适配器

常用适配器介绍与使用

ArrayAdapter

特定:使用简单、用于将数组、List 形式的数据绑定到列表中作为数据源,支持泛型操作

步骤:

  1. 在 xml 文件布局上实现 ListView
  2. 在 Activity 中定义数据源(列表或者数组)
  3. 构造 ArrayAdapter 对象,设置适配器
  4. 将 ListView 绑定到 ArrayAdapter 上
  5. 完事

具体实现:

  1. 添加 ListView
  1. 定义数据源
List listData = new ArrayList<>();for(int i=0;i<20;i++){ listData.add("item数据"+i);}
  1. 创建 ArrayAdapter 适配器
ArrayAdapter arrayAdapter = new ArrayAdapter<>(this,android.R.layaout.simple_list_item_1,listData);这里简单介绍一下 ArrayAdapter 的构造方法,ArrayAdapter 有好几个构造方法。其中第一参数都是 Context 第二个参数就是要添加的 item 的布局 id 然后就是数据,数据可以使用数组也可以使用List。还有一点要注意的是,如果 List 里面存放的是一个普通对象而不是String 的话,则显示在 item 中的数据为这个对象调用 toString 后的结果。
  1. 将 ArrayAdapter 适配器绑定到 ListView 上
listView.setAdapter(arrayAdapter);

使用 ArrayAdapter 的缺点

ArrayAdapter 使用起来非常简单,也就导致了功能实现非常局限,每个列表项只能是 TextView。可用的 item 布局要足够简单!

SimpleAdapter

相比 ArrayAdapter 来说,功能比较强大,可以将数据源的数据一一的绑定到 item 中的 view 中。

使用步骤:

  1. 在 xml 中添加 ListView
  2. 实现 item 布局(根据实际UI需求)
  3. 创建数据源(数据源形式有要求 List)
  4. 创建 SimpleAdapter 适配器
  5. 将 SimpleAdapter 适配器绑定到 ListView 中
  6. 完事

具体实现

  1. 在 xml 中添加 ListView
  1. 实现 item 布局,这里我自己随便写了一个布局
  1. 创建数据源,使用 SimpleAdapter 的时候创建数据源很关键。
  2. 数据源的固定格式是 List> ,一般我们都这样写 List> ,当然 List 里面存放的一条一条的数据就是对应 itme 中的数据。如果 item 中的布局有点复杂的话,item 中的每个控件又需要设置不同的值,那么 item 中的每个布局的内容就又对应 HashMap 中的值了。
// 比如上面的布局,有 4 个内容需要填充,则对应的数据源应该是HashMap hashMap = new HashMap<>();hashMap.put("name

android listview 滑动条显示_ListView详细介绍与使用相关推荐

  1. android listview 滑动条显示_第七十六回:Android中UI控件之RecyclerView基础

    各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView.闲话休提,言归正转.让我们一起Talk Androi ...

  2. android listview 不显示_ListView详细介绍与使用

    image 前言介绍: 关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日 ...

  3. android gridview滑动监听,Android GridView 滑动条设置一直显示状态(推荐)

    Android GridView 滑动条设置一直显示状态(推荐) 模拟GridView控件: android:id="@+id/picture_grid" android:layo ...

  4. android ListView 九大重要属性详细分析

    2019独角兽企业重金招聘Python工程师标准>>> android ListView 九大重要属性详细分析 1.android ListView 一些重要属性详解,兄弟朋友可以参 ...

  5. Android manifest文件中的标签详细介绍

    Android manifest文件中的标签详细介绍 概要 每一个Android应用都应该包含一个manifest文件,即AndroidManifest.xml.它包含了程序运行的一些必备信息,比如: ...

  6. Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  7. android中intent放数据类型,Android Intent传递数据底层分析详细介绍

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  8. OpenCV创建滑动条函数:createTrackbar()介绍

    OpenCV创建滑动条函数:createTrackbar()介绍

  9. Android上下左右滑动,显示底层布局

    转载博客地址:http://www.cnblogs.com/flyme2012/p/4106308.html 闲着没事做了一个小东西.Android的上下左右滑动,显示底层布局.可以做类似于QQ消息列 ...

最新文章

  1. 阿里面试官:接口的幂等性怎么设计?
  2. 信息学奥赛C++语言: 博物馆
  3. 平台卖家要不要做独立站?
  4. js截图插件_WordPress外贸网站插件装多了很卡很卡?别慌,试试这招
  5. 2021美赛总结(假)。预祝大家获得满意的成绩!
  6. 邯郸市计算机中专学校地址,邯郸蓝天信息工程中专学校
  7. JAVA学习(五):Java面向对象编程基础
  8. Jeecg Boot连接人大金仓数据库步骤及常见问题
  9. Java封装代码年龄性别姓名_Java生成随机姓名、性别和年龄的实现示例
  10. SQL 数据库 学习 016 如何附加数据库
  11. Java 使用itextpdf添加图片印章到PDF
  12. java 自定义 jpanel_在JList中使用自定义JPanel组件 - java
  13. 量化交易中用到的回测评估指标(策略收益、基准收益、Alpha比率、Beta比率、夏普比率、索提诺比率)详解
  14. Python中单引号,双引号,3个引号的用法
  15. [ecshop 资料] ecshop 安装须知 - 支付插件的问题 。。ectouch 小京东
  16. Vue【vue-seamless-scroll】滚动组件及注意事项
  17. RL极简入门:从MDP、DP MC TC到Q函数、策略学习、PPO
  18. 基于WPF的桌面宠物开发(一) :WPF简介+环境搭建+简单界面
  19. 转] 动漫电影 剧集 (怕自己有一天不小心忘了,写下来记住)
  20. 【LeetCode 871】 Minimum Number of Refueling Stops

热门文章

  1. 传统版生产者消费者模式2.0
  2. Python中MD5加密
  3. solr6.6 导入 文本(txt/json/xml/csv)文件
  4. MongoDB联合查询 -摘自网络
  5. iOS开发 - 利用js去除webview广告
  6. 看云计算时代的web1800远程服务支持系统
  7. VS2008 安装部署工程的小问题
  8. Activity端详
  9. JavaScript使用技巧(2)
  10. Twproject Gantt – 开源的 JavaScript 甘特图组件