初识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属性及相关方法如下表所示。

XML属性

相关方法

说明

android:choiceMode

设置 AbsListView 的选择行为。该属性支持如下属性值 : none : 不显示任何选中项 singleChoice : 允许单选 multipleChoice : 允许多选 multipleChoiceModal : 允许多选

android:drawSelectorOnTop

setDrawSelector(boolean)

如果该属性设置为 true,选中的列表项将会显示在上面

android:fastScrollEnabled

设置是否允许快速滚动。如果该属性设置为 true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动

android:listSelector

setSelector(int)

指定被选中的列表项上绘制的 Drawable

android:scrollingCache

如果设置为 true,该组件在滚动时将会使用绘制缓存

android:smoothScrollbar

setSmoothScrollbarEnable(boolean)

如果设置为 false,则不在 header View 之后绘制分割条

android:stackFromBottom

设置是否从底端开始排列列表项

android:textFilterEnabled

设置是否对列表项进行过滤,当该 AbsListView 对应的 Adapter 实现了 Filter 接口时该属性才会起作用

android:transcriptMode

设置该组件的滚动模式。该属性支持如下属性值: disabled : 关闭滚动。这是默认值 normal : 当该 AbsListView 收到数据改变通知,且最后一个列表项可见时,该 AbsListView 将会滚动到底端 alwaysScroll : 该 AbsListView 总会自动滚动到底端

先从比较简单的子类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=''@array/countries",该属性值用到了数组资源,因此还需要在应用中定义一个名为countries的数组。

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="countries">
        <item>中华人民共和国</item>
        <item>美利坚合众国</item>
        <item>大韩民国</item>
        <item>俄罗斯联邦</item>
        <item>巴西联邦共和国</item>
        <item>墨西哥合众国</item>
        <item>新西兰</item>
        <item>阿拉伯埃及共和国</item>
        <item>比利时王国</item>
    </string-array>
</resources>

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

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

本文分享自微信公众号 - 分享达人秀(ShareExpert),作者:鑫鱻

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ListView优化和列表首尾使用

    前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪些方法技巧来优化ListVi...

    分享达人秀
  • ListActivity和自定义列表项

    相信通过前两期的学习,以及会开发最简单的一些列表界面了吧,那么本期接着来学习更多方法技巧。 一、使用ListActivity 如果程序的窗口仅...

    分享达人秀
  • AnalogClock、DigitalClock和TextClock时钟组件

    在前面一期,我们学习了DatePicker和TimePicker,在实际开发中其不能完全满足我们对时间和日期的处理。 如果只是想要显示时间,而不...

    分享达人秀
  • Flutter区别于其他技术的关键是什么?

    上一篇文章中我们了解到,跨端方案经历了三个阶段,第一阶段是混合开发的Web容器时代,第二阶段是以RN和Weex为代表的泛Web容器时代,第三阶段就是以Flutt...

    拉维
  • Android ListView组件的使用

    ListView是Android开发中非常常用的组件,ListView可以用来显示一个列表,我们可以对这个列表操作,比如点击列表要做什么等等。这篇文章主要通过一...

    飞雪无情
  • 【Flutter 专题】 03 图解第一个程序 Hello World!

    无论是学习哪门语言,第一个程序都是 Hello world! 和尚我最近在学习 Flutter 因此整理一下在第一个测试 Demo 中遇到的一些问题...

    阿策
  • 开源无止境,Flutter会成为跨平台开发领域里的新搅局者吗?

    在17年的谷歌I/O大会上,Google 推出了Flutter- 一款新的用于创建移动应用的开源库。在18年初世界移动大会上发布了Flutter的第一个Beta...

    IMWeb前端团队
  • AnimationDrawable 实现正在加载的旋转动画

    要实现这样的效果  就是中间的那个   正在拼命加载数据中  然后是那个动画在不停的旋转,

    wust小吴
  • Android中使用ShareSDK集成分享功能的实例代码

    现在APP开发集成分享功能已经是非常普遍的需求了。其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮...

    砸漏
  • golang 基于Mac os 构建镜像

    自定义基础镜像官方文档看完后最还是google一下如何构建,tar cv --files-from /dev/null | docker import - sc...

    笨兔儿

扫码关注云+社区

领取腾讯云代金券