您的位置:首页 > 移动开发 > Android开发

Android控件第3类——AdapterView

2016-03-09 22:48 369 查看
  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)[b]关联数据[/b]

  Spinner是提供用户选择的列表框,类似于下拉列表框。

7、Gallery,继承自AbsSpinner,需要使用setAdapter(SpinnerAdapter)[b]关联数据,已经不推荐使用[/b]

  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。这样就极大的降低了内存和时间的消耗。

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参数获得列元素的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: