《Android UI基础教程》——2.4节显示列表

简介:

本节书摘来自异步社区《Android UI基础教程》一书中的第2章,第2.4节显示列表,作者 【美】Jason Ostrander,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.4 显示列表
Android UI基础教程
用来开发应用最常见的视图类型之一就是ListView。这个视图呈现了一个垂直滚动的项目列表。每一行都会有一些文本但是通常也会包含其他视图,例如ImageView和按钮等(联系人应用就是很好的例子)。当你需要把数据列表呈现给用户的时候,使用ListView最合适。它是如此常见,以至于Android实际上提供了展示一个列表的内置活动。

2.4.1 ListActivity
一个ListActivity将绑定到一个包含有ListView的默认视图。不必要在活动的onCreate方法中调用setContentView,因为默认情况下ListActivity已经被设置为ListView了(当然你可以自定义一个视图,如果你选择这么做的话)。ListActivity类也包含了一些搜索和设置列表数据以及处理项目选择的方便方法。虽然使用ListActivity来展示列表并不是必须,但是当你想要把列表数据展示给用户时你应该考虑使用它。

Android 默认布局

ListActivity实际上把它的内容设置到了一个构建于Android OS上的特殊布局上。这个布局包含内容单一的ListView。在创建应用时,还有另一些内置的布局可以使用,许多这类布局都被包含在android.R.layout类中。下面是你可以和ListView一起使用的两个布局。 android.R.layout.simple_list_item_1用来让一个ListView每行显示一行文本。 android.R.layout.two_line_list_item用来让列表每行显示两行文本。

2.4.2 XML布局
显示列表很方便,但是有时候你需要展示的远不止一个列表。在这些情况下,你可以创建一个标准的布局文件并且使用列表视图来展示列表。列表视图和Android中的其他视图使用的定义方式相同:

`<ListView android:layout`_`width="match`_`parent"`
`    ``android:layout`_`height="match`_`parent" android:id="@+id/list">`
`</ListView>`

列表视图有一些特殊的属性,可以在更复杂的布局中使用这些属性。首先是android:entries属性。当有一个静态的。不变的值的列表来填充列表视图时使用这个属性。你可以通过简单地引用资源来使用entries属性,而不需要编程来填充列表。还有一些改变外观和分隔行之间行为的属性。总的来说,你应该与默认值保持一致,不要与平台的外观和感觉相悖。

行布局

为列表行创建布局与为活动创建布局相同:你需要创建一个有布局容器以及一些视图的XML文件。每一行都会包含那个布局,这让你可以设置文本和图像的值。Android平台提供了一些默认的行布局。一般来说对于你想创建的列表视图这些已经够用了。然而,你同样可以为列表行创建自定义的布局。要创建自定义布局,只需创建一个新的布局文件并在把数据绑定到列表视图时使用它。

时间跟踪应用程序将需要为它的列表视图自定义布局。在res/文件夹中,新建一个名为time_row.xml的布局文件:

`<?xml version="1.0" encoding="utf-8"?>`
`<LinearLayout xmlns:android="http://schemas.android.com/`
`→ apk/res/android"`
` ``  `` ``android:id="@+id/time`_`row" android:orientation="horizontal"`
` ``  `` ``android:layout`_`width="match`_`parent"`
` ``  `` ``→ android:layout`_`height="wrap`_`content"`
` ``     `` ``android:gravity="center" android:paddingLeft="10dp"`
` ``  `` ``   android:paddingRight="10dp" android:paddingBottom="20dp"`
` ``     `` ``android:paddingTop="20dp">`
` ``     `` ``<TextView android:id="@+id/lap`_`name"`
` ``  `` ``   → android:layout`_`height="wrap`_`content"`
` ``  ``  ``     android:text="Lap 1" android:layout`_`weight="1"`
` ``     ``  ``  → android:layout`_`width="0dp" />`
` ``  `` ``      <TextView android:id="@+id/lap`_`time"`
` ``  `` ``      → android:layout`_`height="wrap`_`content"`
` ``     ``  ``     android:text="00:00:00" android:layout`_`weight="1"`
` ``  ``  ``        android:layout`_`width="0dp" android:gravity="right" />`
`</LinearLayout>`

这个文件使用一个简单的线性布局来展示两个并排的文本视图:

一个是会议的名称,另一个是会议的时间。线性布局使用padding来创建文本视图之间的空间。

2.4.3 把数据绑定到列表
如果你已经知道列表元素都是哪些,那么ListView的entries属性将会很管用。但是如果你希望动态生成列表,那么你需要建立一个列表适配器。ListAdapter基于一些内部的数据存储往ListView中填充数据。有的ListAdapter是用一个静态值的地图来填充列表(与使用XMLentries属性类似),从数组中载入行,从数据库中载入数据。ListAdapter是Adapter类的一个具体的例子。Adapter类被用于往UI的视图上绑定数据(在本书之后的内容中,你会了解更多这方面的知识)。

当你创建一个列表适用器之后,你要重写getView方法。这个方法在列表视图的每一行都会被系统调用。它会使用列表的位置、任何存在的该行的布局以及该行的父视图,并且它会返回行布局视图。对于时间跟踪应用来说,你将会使用先前创建的行布局。创建一个继承自ArrayAdapter<Long>的新类。然后重写getView方法来为列表视图的每一行加载自定义的time_row.xml布局。

`public class TimeListAdapter extends ArrayAdapter<Long> {`
` ``  `` `` public TimeListAdapter(Context context, int textViewResourceId) {`
` ``  `` `` `` ``  `` ``super(context, textViewResourceId);`
` ``  `` `` }`
` ``  `` `` @Override`
` ``  `` `` public View getView(int position, View convertView,`
` ``  `` `` → ViewGroup parent) {`
` ``  `` `` `` ``  `` ``View view = convertView;`
` ``  `` `` `` ``  `` ``if (view == null) {`
` ``  `` `` `` ``  `` `` `` ``  `` ``view = LayoutInflater.from(getContext()).inflate`
` ``  `` `` `` ``  `` `` `` ``  `` ``→ (R.layout.time`_`row, null);`
` ``  `` `` `` ``  `` `` }`
` ``  `` `` `` ``  `` `` long time = getItem(position);`
` ``  `` `` `` ``  `` `` TextView name = (TextView) view.findViewById(R.id.lap`_`name);`
` ``  `` `` `` ``  `` `` String taskString = getContext().getResources().getString`
` ``  `` `` `` ``  `` `` → (R.string.task`_`name);`
` ``  `` `` `` ``  `` `` name.setText(String.format(taskString, position+1));`
` ``  `` `` `` ``  `` `` TextView lapTime = (TextView) view.findViewById`
` ``  `` `` `` ``  `` `` → (R.id.lap`_`time);`
` ``  `` `` `` ``  `` `` lapTime.setText(DateUtils.formatElapsedTime(time));`
` ``  `` `` `` ``  `` `` return view;`
` ``  `` `` }`
`}`

这种方法为列表视图的每一行都扩展了一个自定义布局。扩展布局就是把XML布局转换成一组View对象(在第三章中你会了解更多这方面的知识)。当用户滚动列表时,系统将会调用这个方法来为列表创建行。那些已经看不见的行将会被回收。在为数据适配器分配内存时你应当当心,避免不必要的内存分配。不必要的垃圾回收事件是造成Android动画不流畅的主要原因之一。在本书的后面章节中你将会学会如何创建有效率的数据适配器。

提示: 若不必要,不要扩展新视图。在代码中,视图只会在它不存在的情况下才会进行扩展。这是阻止不必要的对象创建以及垃圾回收的一个优化方法。

2.4.4 Loader
往列表适配器中加载数据可能是一个相当乏味的过程:你需要异步处理事务,以避免在主进程上执行太多工作;你需要在数据改变时重新加载数据适配器以保持展示的数据为最新;你还需要在手机的朝向改变时保存数据,因为在这个过程中会销毁并重新创建活动。为了简化这个过程,Android 3 引入了一个名叫Loader的帮助类。Loader类让异步加载数据变得更加简单。

Loader类通过兼容包可以兼容所有Android版本。此包包括了诸如loader和fragmant之类的新Android API,从而你可以在老的Android版本中使用它们。在随后的章节中,你会学到更多关于loader和fragment的知识,但到目前为止,你只需记得你可以通过Loader类简单地把数据绑定到视图上。

Android活动代表用户的界面。所有与用户有关的交互都通过活动发生。作为一个开发者,在创建快速响应的应用时把用户放在第一位很重要。这可能像使用易读的文本视图一样简单,也可能像用户查询时把输入内容保存到数据域一样复杂。理解活动是创建可用的快速响应应用程序的关键。

相关文章
|
14天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
37 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
90 11
|
2月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
3月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
62 2
|
3月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
5月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
126 1
|
6月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
6月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
110 1
|
6月前
|
Android开发 开发者 UED
Android项目架构设计问题之加载数据到列表如何解决
Android项目架构设计问题之加载数据到列表如何解决
51 0
|
6月前
|
API Android开发
Android项目架构设计问题之选择和使用合适的UI库如何解决
Android项目架构设计问题之选择和使用合适的UI库如何解决
71 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    Android历史版本与APK文件结构
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡