Android开发(三)| 最常用和最难用的控件

经过前面的学习,我们已经能开发简单又不失美观的程序界面了。

但是在之前的布局中,我们没有用到Android开发中最常用的一种控件——ListView,所以界面可能显得有些单调。

几乎所有的应用程序都会用到ListView。因为手机、平板的屏幕空间都有限,能够一次性在屏幕上显示的内容并不多。而ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据会滚动出屏幕。

我们每天刷微博、翻阅新闻都在使用这个控件。相比按钮、文本框等控件,ListView的用法也相对复杂很多。

现在我们就单独使用本章,来深入了解这一控件的使用。

一、ListView的简单用法

新建一个ListViewTest项目,然后修改activity_main.xml中的代码:

加入ListView

在布局中加入ListView控件还是非常简单的,先为ListView指定一个id,然后将宽高都设为match_parent,这样ListView占据了整个布局的空间。

接着修改MainActivity中的代码如下:

MainActivity

ListView是用于展示大量数据的,我们先将数据准备好。这些数据可以是从网上下载的,也可以是从数据库中读取的。这里简单使用了一个data数组来测试,里面包含了很多书籍的名称。

但数组中的数据无法直接传递给ListView,还需要借助适配器来完成。

ArrayAdapter适配器

Android中提供了很多适配器的实现类,我们这儿选用其中非常好用的ArrayAdapter。它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入即可。

这个例子中的数据都是字符串,我们把ArrayAdapter的泛型指定为String

接着在ArrayAdapter的构造函数中依次传入:当前上下文、ListView子项布局的id、要适配的数据。我们使用android.R.layout.simple_list_item_1作为ListView子项布局id,它是一个Android内置布局文件,里面只有一个TextView。

最后,调用ListView的setAdapter()方法,将构建好的适配器对象传递进去。ListView和数据间的关联终于建立完成了。

现在运行一下程序,效果如图:

ListView的简单使用

可以通过滚动的方式来查看屏幕外的数据。

二、定制ListView的界面

想必你也觉得,只能显示一段文本的ListView实在太单调了吧!我们现在就来对ListView界面定制升级,丰富它的内容。

我们先准备好一组图书封面的照片,对应上面的每一本书,待会要将它们显示出来。

然后定义一个实体类,作为ListView适配器的适配类型。在ListViewTest下的src目录右键→新建类Book,代码很简单,如下:

Book类

Book类只有三个字段,name表示书名,imageId表示书名对应图片的资源,describe表示书中摘取的一句金句。

接着需要为ListView的子项指定一个自定义布局。在layout目录下新建book_item.xml,代码截取如下:

book_item.xml

在自定义布局中,我们定义了一个ImageView用于显示书封面图片,又定义了两个TextView分别显示书名和金句。另外使用了简单的布局嵌套,让内容排版显示更加合理。

接下来,当然是创建一个自定义的适配器,这个适配器继承自ArrayAdapter。你应该猜到了,适配器的泛型指定为Book类。新建类BookAdapter,代码如下:

自定义适配器

BookAdapter重写了父类的一组构造函数,用于将上下文、ListView子项布局id、数据一块传递进来。另外重写了getView()方法得到当前项的Book实例。

再使用LayoutInflater来为子项加载我们传入的布局。接着调用View的findViewById()方法分别获取到两个TextView和ImageView的实例,并分别调用它们的setImageResource()和setText()方法来设置显示的文字与图片。

最后将布局返回,这样我们自定义的适配器就全部完成了。

下面修改MainActivity中的代码:

MainActivity
接上页

我们在这里添加了一个initBooks()方法,用于初始化所有的书籍数据。以后我们还可以从网页、数据库中读取需要的数据。

在Book类的构造函数中把图书的书名、金句和对应图片的id传入,然后把创建好的对象添加到图书列表中。接着我们在onCreate()方法中创建了BookAdapter对象,并将BookAdapter作为适配器传递给ListView。

这样,我们定制的ListView界面就完成了。现在重新运行程序,得到如下效果:

书籍展示(1)
书籍展示(2)

尽管目前我们定制的界面还是比较简单,但是聪明的读者一定已经发现,只要修改book_item.xml中的内容,就可以私人定制各种复杂的界面了。

三、提升优化ListView的运行效率

开头我们就提到过,ListView这个控件相对难用,就是因为它有很多的细节可以优化,其中很重要的一点就是运行效率

目前我们的ListView运行效率还是很低的,因为BookAdapter的getView()方法每次都将布局重新加载了一遍,当ListView快速滚动时就会成为性能的瓶颈。

存在重复加载布局

仔细观察,getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,方便以后的重用。修改BookAdapter中的代码:

在getView()中进行判断

现在我们在getView()方法中进行了判断,如果convertView为空,则使用LayoutInflater去加载布局,如果不为空则直接对convertView重用。

这样大大提高了ListView的运行效率,在快速滚动时能表现出更好的性能。

四、ListView的点击事件

ListView的滚动只是满足了我们视觉上的效果,可是如果ListView中的子项不能点击的话,这个控件就没有什么实际用途了。因此,我们顺带来学习ListView如何才能响应用户的点击事件。

修改MainActivity中的代码:

点击事件

我们使用了setOnClickListener()方法来为ListView注册了一个监听器,当用户点击了ListView中的任何一个子项就会回调onItemClick()方法。

在这个方法中可以通过position参数判断用户点击的是哪一个子项,然后获取到相应的图书,并通过Toast将图书书名显示出来。

重新运行程序,并点击一下“白夜行”,效果如图所示:

响应鼠标点击

这就是ListView点击事件的简单运用。

除了图书列表,我们再来一个实例效果呈现:

简单的火车票查询

怎么样,很简单吧。只是一些控件和文字的简单组合,我们可以通过滚动鼠标查询各个火车班次信息。具体代码这儿就不演示了,类似于图书列表。

如果再往里加入按钮和点击相应事件,该实例就可以完成选座、订票等功能啦。具体我们留到下次讲解。


本章小结:ListView控件的使用,可以提升信息量和灵活度,大大增进程序与用户间的友好度,让程序想用户所想更好的为用户服务。

经过多次编程实践,我们差不多可以把ListView轻松拿下了。

最后一点小tip:存储在drawable目录下的图片不能用大写字母命名,否则编译时会报错;但图片具体格式不限。

作者:叶琛

一个痴迷旅行的IT程序狗


附本系列安卓开发(一)、(二)的文章链接,备需:

Android开发(一) 创建第一个Android项目

Android开发(二) 编写程序界面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容