原文:Android零基础入门第37节:初识ListView

之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录、电话列表、信息列表等。那么从本节开始来详细学习列表界面设计。

一、了解ListView

在Android开发中,ListView是比较常用的控件,它以列表的形式显示具体内容,并且能够根据数据的长度自适应显示。在学习ListView之前,先来一起了解AdapterView。

AdapterView是一组重要的组件,AdapterView本身是一个抽象基类,它派生的子类在用法上十分相似,只是显示界面有一定的区别,因此把它们归为一类,针对它们的共性集中讲解,并突出介绍它们的区别。AdapterView主要具有以下几个特征。

  • AdapterView继承了 ViewGroup,它的本质是容器。

  • AdapterView可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来。

  • AdapterView显示的多个“列表项”由Adapter提供。调用AdapterView的 setAdapter(Adapter)方法设置 Adapter 即可。

AdapterView及其子类的关系如下图所示。

从上图可以看出,AdapterView派生了三个子类:AbsListView、AbsSpinner 和 AdapterView Animator,这三个子类依然是抽象的,实际使用时往往采用它们的子类。其中AbsListView提供的常用XML属性及相关方法如下表所示。

先从比较简单的子类ListView的使用方法开始学习,使用ListView主要有以下两种方式。

  • 直接使用ListView进行创建。

  • 让 Activity 继承 ListActivity (相当于该 Activity 显示的组件为 ListView,后续再进行学习)。

一旦在程序中获得了 ListView之后,接下来就需要为ListView设置它要显示的列表项了。 在这一点上,ListView显示出AdapterView的特征:通过setAdapter(Adapter)方法为之提供 Adapter,并由Adapter提供列表项即可,关于Adapter的使用会在后续进行学习,欢迎关注分享达人秀(ShareExpert)获取最新教程,也欢迎加入Android入门技术讨论微信群,可先添加好友(jinwenyu2010)备注Android群,然后拽进群。

ListView提供的常用XML属性如下所示:

  • android:divider:设置 List 列表项的分隔条(即可用颜色分隔,也可用 Drawable 分隔)。

  • android:dividerHeight:设置分隔条的高度。

  • android:entries:指定一个数组资源,Android 将根据该数组资源来生成 ListView。

  • android:footerDividerEnabled:如果设置为 false,则不在 footer View 之前绘制分隔条。

  • android:footerDividerEnabled:如果设置为 false,则不在 header View 之后绘制分隔条。

二、ListView简单示例

接下来通过一个简单的示例程序来学习ListView的常见用法。

我们在之前一直使用的WidgetSample工程默认app模块,为了更方便代码管理,本期开始的列表组件的学习专门新建一个Module来完成。

新建Module主要有两种方式,选中WidgetSample工程,依次选择菜单栏File -> New -> New Module,或者选中WidgetSample工程后右键依次选择New -> Module,如下图所示:

然后会弹出如下Module新建页面:

选择默认的“Phone & Tablet Module”,点击“Next”进入下一步。

输入工程名称和Module名称,一般输入工程名称后Module名和包名也会跟随改变,根据自己的需要选择是否需要调整,然后点击“Next”进入下一步。

这个页面是不是比较熟悉了,没错,就是之前创建WidgetSample工程相同的操作。这里选择默认的空白Activity,然后点击“Next”进入下一步。

同样的,Activity和layout命名页面也是非常熟悉的,仍然使用默认的命名,点击“Finish”完成创建。于是可以看到在WidgetSample工程下新增了一个与app并列的listviewsample的Module,如下图所示:

关于Module的作用不是很理解的,这里不再重复讲解了,建议回头再去看一遍之前的内容:掌握Android Studio项目结构

可以发现新建的listviewsample与app的目录结构完全相同,再操作上也是相同的,后期不做过多说明,如果仍有问题建议添加小编好友(jinwenyu2010)拽入Android入门技术分享微信群探讨。

在app/main/res/layout/目录下找到activity_main.xml文件,在其中填充如下代码片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <!-- 直接使用数组资源给出列表项 -->
<!-- 设置使用蓝色的分隔条 -->
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/countries"
android:divider="#00f"
android:dividerHeight="2px"
android:headerDividersEnabled="false"/>
</LinearLayout>

上面的界面布局文件中定义了一个ListView,并通过android:entries指定了列表项数组, 该ListView还通过android:divider改变了列表项之间的分隔条。

上面这个ListView指定了 android:entries=&apos;&apos;@array/countries",该属性值用到了数组资源,因此还需要在应用中定义一个名为countries的数组。

在应用程序的res/values/目录下创建一个arrays.xml文件,在其中定义countries数组。arrays.xml的代码如下:

运行程序(注意鼠标的焦点应该在listviewsample这一Module下,在工具栏的Module栏会显示listviewsample),可以看到如下图所示列表效果。

从上述示例程序发现,使用数组创建ListView非常简单,但这种ListView 能定制的内容很少,甚至连每个列表项的字号大小、颜色都不能改变。 如果想对ListView的外观、行为进行定制,就需要把ListView作为AdapterView使用,通过Adapter控制每个列表项的外观和行为。

由于这一块的内容较多,后续几期内容再接着继续分享。

今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!

往期总结分享:

Android零基础入门第1节:Android的前世今生

Android零基础入门第2节:Android 系统架构和应用组件那些事

Android零基础入门第3节:带你一起来聊一聊Android开发环境

Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招

Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神

Android零基础入门第6节:配置优化SDK Manager, 正式约会女神

Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅

Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点

Android零基础入门第9节:Android应用实战,不懂代码也可以开发

Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio

Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌

Android零基础入门第13节:Android Studio配置优化,打造开发利器

Android零基础入门第14节:使用高速Genymotion,跨入火箭时代

Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航

Android零基础入门第16节:Android用户界面开发概述

Android零基础入门第17节:TextView属性和方法大全

Android零基础入门第18节:EditText的属性和使用方法

Android零基础入门第19节:Button使用详解

Android零基础入门第20节:CheckBox和RadioButton使用大全

Android零基础入门第21节:ToggleButton和Switch使用大全

Android零基础入门第22节:ImageView的属性和方法大全

Android零基础入门第23节:ImageButton和ZoomButton使用大全

Android零基础入门第24节:自定义View简单使用,打造属于你的控件

Android零基础入门第25节:简单且最常用的LinearLayout线性布局

Android零基础入门第26节:两种对齐方式,layout_gravity和gravity大不同

Android零基础入门第27节:正确使用padding和margin

Android零基础入门第28节:轻松掌握RelativeLayout相对布局

Android零基础入门第29节:善用TableLayout表格布局

Android零基础入门第30节:两分钟掌握FrameLayout帧布局

Android零基础入门第31节:少用的AbsoluteLayout绝对布局

Android零基础入门第32节:新推出的GridLayout网格布局

Android零基础入门第33节:Android事件处理概述

Android零基础入门第34节:Android中基于监听的事件处理

Android零基础入门第35节:Android中基于回调的事件处理

Android零基础入门第36节:Android系统事件的处理

Android零基础入门第37节:初识ListView的更多相关文章

  1. Android零基础入门第44节:ListView数据动态更新

    原文:Android零基础入门第44节:ListView数据动态更新 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是 ...

  2. Android零基础入门第43节:ListView优化和列表首尾使用

    原文:Android零基础入门第43节:ListView优化和列表首尾使用 前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪 ...

  3. Android零基础入门第38节:初识Adapter

    原文:Android零基础入门第38节:初识Adapter 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MVC模式 在开始 ...

  4. Android零基础入门第58节:数值选择器NumberPicker

    原文:Android零基础入门第58节:数值选择器NumberPicker 上一期学习了日期选择器DatePicker和时间选择器TimePicker,是不是感觉非常简单,本期继续来学习数值选择器Nu ...

  5. Android零基础入门第59节:AnalogClock、DigitalClock和TextClock时钟组件

    原文:Android零基础入门第59节:AnalogClock.DigitalClock和TextClock时钟组件 在前面一期,我们学习了DatePicker和TimePicker,在实际开发中其不 ...

  6. Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker

    原文:Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker 在实际开发中,经常会遇见一些时间选择器.日期选择器.数字选择器等需求,那么从本期开始来学习And ...

  7. Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图

    原文:Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图 前面两期学习了 ViewAnimator及其子类ViewSwitcher的使用,以及ViewSwitcher的 ...

  8. Android零基础入门第55节:ImageSwitcher和TextSwitcher使用

    原文:Android零基础入门第55节:ImageSwitcher和TextSwitcher使用 上一期我们了解了ViewAnimator组件和ViewSwitcher组件的使用,你都掌握了吗?本期一 ...

  9. Android零基础入门第54节:视图切换组件ViewSwitcher

    原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...

随机推荐

  1. 【codeforces 765D】Artsem and Saunders

    [题目链接]:http://codeforces.com/contest/765/problem/D [题意] 给你一个函数f(x); 要让你求2个函数g[x]和h[x],使得g[h[x]] = x对 ...

  2. Javascript中eval解析的json的几种用法

    eval解析json字符串可用的三种方式都可以实现... <!DOCTYPE html> <html> <head> <meta charset=" ...

  3. 学习鸟哥的Linux私房菜笔记(2)——基础指令

    ls :列出文件和目录 ls -l :列出文件和目录的详细信息 ls -a:列出所有的文件和目录(包括隐藏目录) cp:拷贝文件 cp 源文件目录  目标目录 cp -r :拷贝目录 mv :移动或重 ...

  4. spring security之httpSecurity 专题

    37.5.2 Resolving the CsrfToken Spring Security provides CsrfTokenArgumentResolver which can automati ...

  5. hbase 从hdfs上读取数据到hbase中

    <dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifact ...

  6. RabbitMQ 延迟队列实现订单支付结果异步阶梯性通知

    在第三方支付中,例如支付宝.或者微信,对于订单请求,第三方支付系统采用的是消息同步返回.异步通知+主动补偿查询的补偿机制. 由于互联网通信的不可靠性,例如双方网络.服务器.应用等因素的影响,不管是同步 ...

  7. js中的apply与call的用法与区别

    call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受参数的 ...

  8. C#之Linq、where()、FindAll()的区别

    原地址 C#之Linq.where().FindAll()的区别 对于实现了IEnumerable接口的类.类型.集合可以使用Linq.Linq的扩展方法where().FindAll()来查询符合谓 ...

  9. 警告异常:Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5

    1.打开 regedit.exe 注册表编辑器 2.找出文件名称 HKEY_CURRENT_USER\Software\JavaSoft 和 HKEY_LOCAL_MACHINE\SOFTWARE\J ...

  10. numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)

    1. np.asarray -- numpy 风格的类型转换 从已有多维数组创建新的多维数组,数据类型可重新设置 >> B = np.asarray(A, dtype='int32') 2 ...