Android控件第3类——AdapterView
AdapterView这一类控件的最大特点,在绝大多数的情况下,它们的数据都由Adapter的子类提供(有时可以在控件的entries属性上直接设置显示的数据)。
调用AdapterView的setAdapter(Adapter)将控件与数据关联。
一、概述
AdapterView是一个抽象类,她继承了GroupView,所以它是一个容器类。它有三个子类:AbsListView、AbsSpinner、AdapterViewAnimator,这三个子类也都是抽象类。与之对应的Adapter是一个接口,它包含两个接口:ListAdapter、SpinnerAdapter。AdapterViewAnimator的子类通常用于滑动显示上一个、下一个控件。
为AbsListView子类添加数据的时候,使用setAdapter(ListAdapter);为AbsSpinner子类添加数据的时候,使用setAdapter(SpinnerAdapter);为AdapterViewAnimator子类添加数据的时候调用setAdapter(Adapter),也就是说,为AdapterViewAnimator子类提供数据的时候,既可以使用ListAdapter、也可以使用SpinnerAdapter。其实,在实际的使用中,并不会有太大的分别。因为在实际使用中,通常都会使用BaseAdapter及其子类(ArrayAdapter、SimpleAdapter、CursorAdapter、ResourceCursorAdapter、SimpleCursorAdapter),而BaseAdapter实现了ListAdapter和SpinnerAdapter两个接口。
需要注意的是ListView的子类ExpandableListView。正常的情况下,这个类应该调用setAdapter(ListAdapter)来关联数据。但是根据ExpandableListView呈现数据的特殊要求,setAdapter(ListAdapter)不能满足要求,所以这个方法将抛出异常;同时,该类提供了setAdapter(ExpandableListAdapter),用于关联数据。ExpandableListAdapter并没有继承Adapter或ListAdapter,它没有继承任何接口。它的实现类包括BaseExpandableListAdapter、SimpleExpandableListAdapter、CursorTreeAdapter、ResourceCursorTreeAdapter、SimpleCursorTreeAdapter,其中,第1、2、5比较常用。
二、常用控件
1、AbsListView,继承自AdapterView,需要使用setAdapter(ListAdapter)关联数据
android:choiceMode,设置AbsListView选择行为,单选/多选(none/singleChoice/multipleChoice/multipleChoiceModal)
android:drawSelectorOnTop(setDrawSelectorOnTop(boolean)),为true,则选中的项会显示到最上面
android:listSelector(setSelector(int)),指定被选中的列表项上绘制的Drawable
2、ListView,继承自AbsListView,需要使用setAdapter(ListAdapter)关联数据
可以使用Activity+ListView(自己添加ListView控件)
也可以直接使用ListActivity,这个Activity自带ListView
android:divider,列表项的分隔符,可以是颜色,也可以是Drawable
android:dividerHeight,分隔符高度
android:entries,指定一个数组,用于指示要显示的数据
3、GridView,继承自AbsListView,需要使用setAdapter(ListAdapter)关联数据
GridView与ListView相似。不同点是ListView只显示一列,而GridView可以显示多列。如果GridView只设置了一列,就和ListView一样了。
可以通过android:numColumns(setNumColumns(int))来设置要显示的列数。
4、AutoCompleteTextView,继承自TextView,需要使用setAdapter(ListAdapter)关联数据
没有继承AdapterView及其子类,它也使用setAdapter为其提供数据,所以放在这里。
它的setAdapter方法的声明如下:public <T extends ListAdapter & Filterable> void setAdapter(T adapter) {......}
5、MultiAutoCompleteTextView,继承自AutoCompleteTextView,需要使用setAdapter(ListAdapter)关联数据
与AutoCompleteTextView基本相似。只是MultiAutoCompleteTextView可以多次输入,并且多次匹配Adapter中的信息。两次输入之间用setTokenizer(MultiAutoCompleteTextView.Tokenizer)来设置。而MultiAutoCompleteTextView提供了一个Tokenizer——CommaTokenizer。这个Tokenizer表示逗号。其写法为setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer())。
6、Spinner,继承自AbsSpinner,需要使用setAdapter(SpinnerAdapter)关联数据
Spinner是提供用户选择的列表框,类似于下拉列表框。
7、Gallery,继承自AbsSpinner,需要使用setAdapter(SpinnerAdapter)关联数据,已经不推荐使用
Spinner是一个垂直的,Gallery是一个水平的。
Spinner提供用户选择,Gallery通常用于查看,可以通过上下滑动查看上一个、下一个列表项。
现在已经不推荐使用Gallery,而是使用HorizontalScrollView和ViewPager来代替。
8、AdapterViewAnimator,继承自AdapterView,需要使用setAdapter(Adapter)关联数据
一次只能显示一个View(View由Adapter.getView()方法提供)
通过showPrevious()和showNext()显示上一个和下一个View
android:animateFirstView属性,显示第一个View的时候是否使用动画
android:inAnimator,android:outAnimator属性,显示和隐藏时使用的动画
android:loopViews属性,循环结束后是否从第一个View重新开始循环
8、AdapterViewFlipper,继承自AdapterViewAnimator,需要使用setAdapter(Adapter)关联数据
android:autoStart属性/startFlipping()方法开始自动播放,stopFlipping()方法停止自动播放。
android:flipInterval属性/setFlipInterval(int)方法设置自动播放的事件间隔。
9、StackView,继承自AdapterViewAnimator,需要使用setAdapter(Adapter)关联数据
与AdapterViewFilpper不同的是,StackView以堆叠的方式显示多个列表项
拖走StackView顶端的View,将会显示下一个View;将上一个View拖进StackView,则那个View就会显示。
也可以通过showPrevious、showNext显示上一个、下一个
10、ExpandableListView,继承自ListView,需要使用setAdapter(ExpandableListAdapter)关联数据
它是一个多层次的ListView,有组和组内成员两种。
android:childDivider属性,组内各子列表项之间的分隔条;android:divider属性,组之间的分隔条。
android:childIndicator属性,子列表项旁边的Drawable对象;android:groupIndicator,组列表项旁边的Drawable对象。
有两个setAdapter,其中一个是继承自ListView的setAdapter(ListAdapter),为了防止使用这个方法,这个方法抛出异常。
常用的ExpandableListAdapter的子类包括:BaseExpandableListAdapter、SimpleExpandableListAdapter、CursorTreeAdapter、ResourceCursorTree、SimpleCursorTreeAdapter。
使用SimpleExpandableListAdapter时需要注意,对应的Layout只能设置TextView,因为Android在实现SimpleExpandableListAdapter的时候,在bindView方法中,将控件强制转换成TextView,而getGroupView和getChildView两个方法都调用了bindView方法。而SimpleAdapter没有这样的强制类型转换,所以可以在Layout上自由的添加控件。
如果使用BaseExpandableListAdapter,需要实现其方法。比较重要的方法为:
- getGroupCount
- getGroupView
- getChildrenCount
- getChildView
三、Adapter及其子类
1、ArrayAdapter,继承自BaseAdapter
new一个ArrayAdapter,通常调用三个参数的构造函数:
- Context
- 用于呈现单个列表项的ResourceId
- List/数组对象作为参数传递到构造函数中。
2、SimpleAdapter,继承自BaseAdapter
与ArrayAdapter类似,new一个SimpleAdapter,只是参数略复杂。一共5个参数:
- Context
- 一个用于存放数据的List<? extends Map<String,?>>
- 用于呈现单个列表项的ResourceId
- String[],用于与第2个参数中Map<String,?>中的String对应的字符串数组
- int[],表示的是控件id,与第三个参数和第四个参数对应。第三个参数可以是一个复杂的控件组合,int数组中的每一项,对应着第三个参数中的一个控件的Id,同时也对应着第4个参数中的一个String字段。表示第2个参数中的String字段对应的数据,显示在第3个参数对应的控件上。
3、BaseAdapter,实现了ListAdapter和SpinnerAdapter
BaseAdapter是一个抽象类,需要实现其方法。
最重要的,需要实现其getView方法:public view getView(int position, View convertView, ViewGroup parent)
在getView方法的参数中,最值得注意的是第2个参数,convertView。如果需要显示的项比较多,一屏无法显示,就会显示滚动条。这个参数代表的就是在滚动条滚动的时候,刚刚被隐藏起来的那个View。这个View因为已经隐藏起来了,我们可以利用这个View来呈现刚刚显示出来的这个View,而不是重新创建一个View。这样就极大的降低了内存和时间的消耗。
强烈建议使用ViewHolder保存对应的View信息,这样可以避免频繁调用findViewById造成的消耗。
如果想要在Adapter发生改变的时候,可以是adapter对应的View(例如ListView)自动更新的话,可以使用Adapter的notifyDataSetChanged()方法。因为在这些View的setAdapter方法中,都会调用adapter对应的注册事件,一旦执行了notifyDataSetChanged(),这些View就会自动更新。
4、BaseExpandableListAdapter
它是一个抽象方法,它的子类中比较常用的包括:SimpleExpandableListAdapter、SimpleCursorTreeAdapter
如果在代码中使用BaseExpandableListAdapter,要实现其方法,比较重要的方法有:
- public int getChildrenCount(int groupPosition)
- public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
- public int getGroupCount()
- public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
5、SimpleExpandableListAdapter
它的参数如下:
- context 与SimpleExpandableListAdapter关联的ExpandableListView的上下文。
- groupData 一个Maps列表(List)。集合中的每个字典项与可折叠列表中的每个组元素一致。字典项提供了组元素包含的所有数据,并包含所有在"groupFrom"中指定的记录。
- expandedGroupLayout 定义组展开时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
- collapasedGroupLayout 定义组折叠时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
- groupFrom 一个键值列表。对应与组相关联的Map中的键值。
- grouptTo 组View应当显示groupFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个groupFrom参数获得列元素的数据。
- childData 一个Map列表的列表。外部列表中的每个实体对应一个组(按照组的位置编号)。在内部列表的每个实体对应某个组的子元素(按照子元素的位置编号)。该Map对应了子元素的数据。(按照childFrom数组中的值编号)。该Map包含了每个子元素的数据,并且应当包括所有在childFrom中指定的实体。
- childLayout 显示子元素的资源文件。该资源文件定义了如何显示子元素。布局文件至少应该包括所有在childTo中定义的View。(即childTo中的view id数组必须都在该布局文件中找到)
- lastChildLayout 定义每组中最后一个子元素的View资源布局情况。该布局文件应当至少包括所有在childTo中所定义的View。(即childTo中的View id数组必须都在该布局文件中找到)
- childFrom 定义显示子元素的列名。该列名与childData中的子元素属性(字典键值)对应。
- childTo 子View应当显示childFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个childFrom参数获得列元素的数据。
Android控件第3类——AdapterView的更多相关文章
- Android控件第7类——对话框
1.AlertDialog AlertDialog用来生成对话框,功能十分强大. AlertDialog可以分成4个组成部分:标题栏上的图标,标题区,文本区,按钮区. 使用方法: 创建AlertDia ...
- Android控件第6类——杂项控件
1.Toast Toast用于显示提示信息. Toast不会获得焦点,没法关闭,过段时间会自动消失. 使用方法:Toast.makeText获得Toast,并设置相关属性.调用Toast对象的show ...
- Android控件第1类——TextView
Android提供TextView,它不能被编辑,它的子类EditText可以编辑.TextView有很多子类. 1.EditText,继承自TextView EditText可以编辑. 可以设置in ...
- Android控件第4类——ProgressBar
ProgressBar是进度条,是比较常用的控件.它有一个抽象的子类——AbsSeekBar,AbsSeekBar有两个比较常用子类,SeekBar.RatingBar. 1.ProgressBar, ...
- Android控件第5类——ViewAnimator
1.ViewAnimator,继承自FrameLayout ViewAnimator是一个基类,它继承自FrameLayout.它的子类有ViewSwitcher和ViewFlipper:ViewSw ...
- Android控件第2类——ImageView
1.ImageView不仅仅可以显示图片,ImageView可以显示任何Drawable对象. adjustViewBounds:设置ImageView是否调整自己的边界来保证图片的长宽比. crop ...
- Android控件介绍
1. 介绍 Android控件大多位于android.widget, android.view.View为他们的父类对于Dialog系列, android.app.Dialog为父类 Android的 ...
- Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像
此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...
- Android 控件架构及View、ViewGroup的测量
附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...
随机推荐
- ThinkPHP5.0 实现 app微信支付功能
相对于之前随笔写的<ThinkPHP5.0实现app支付宝支付功能>来说,php对接app微信支付功能就相对简单的多了,最近有加我的朋友问到app微信支付,所以我把app微信支付的demo ...
- 如何使用openscad绘制一个简单的键帽.
1 新建空项目 2测数据 测量得出数据.这个长方体的长宽高分别是1.6.4.6.8 注意,这三个数据并不是测量得到的数据,而且加了一点公差值(为3D打印做准备) 3画图 写代码 导入模型 为了方便以后 ...
- Shell获取指定时间
时区基本知识 相差一个时区(经度15度)时间相差一小时.简单计算口诀:1.同一个时区的相差时间用减法,2.不同时区的相差时间用加法.3东加西减.例如一,东八区是8点,问东1区几点.根据上面口诀1,算: ...
- P1160 队列安排 luogu洛谷
题目描述 一个学校里老师要将班上NNN个同学排成一列,同学被编号为1∼N1\sim N1∼N,他采取如下的方法: 先将111号同学安排进队列,这时队列中只有他一个人: 2−N2-N2−N号同学依次入列 ...
- JDBC使用MYSQL的LOAD DATA LOACAL INFILE和LOAD DATA INFILE
MYSQL的LOAD方法都必须建立在mysql服务允许使用该命令的情况下: 开启该命令的方法: 1.在实例对应的my.cnf(windows为my.ini)中添加一行local-infile=1(默认 ...
- Google 是如何收集我们的个人数据的
简评:还有其他公司比 Facebook 更能收集我们的数据么?大概,可能,没准是谷歌.(文末彩蛋) 最近 Facebook 已经因为收集个人数据而站在了聚光灯前,它收集用户数据并因此获利. 但是要知道 ...
- 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)
由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...
- ASP.NET Core中获取完整的URL(转载)
在之前的ASP.NET中,可以通过 Request.Url.AbsoluteUri 获取,但在ASP.NET Core没有这个实现,请问如何获取呢?方法一:先引用“using Microsoft.As ...
- c# 获取文件本身的哈希值
1. 哈希值是什么 我个人认为,哈希值是一个统称,也就是经过加密算法后得出的长度较短.位数固定的输出序列即散列值,这个哈希值是一个凭证,一个数字签名之类的,唯一对应你加密之前的东西,这都是我自个儿觉得 ...
- SpringBoot日记——Spring的安全配置-登录认证与授权
安全是每个项目开发中都需要考虑的,比如权限控制,安全认证,防止漏洞攻击等. 比较常见的安全框架有:Apache的shiro.Spring Security等等,相信用shiro的用户群体更多,而sec ...