Android控件第3类——AdapterView

Posted 环游世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、SimpleCursorTreeAdapter

  如果使用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)

 

以上是关于Android控件第3类——AdapterView的主要内容,如果未能解决你的问题,请参考以下文章

Android高级控件--AdapterView与Adapter

UI组件之AdapterView及其子类Spinner控件具体解释

UI组件之AdapterView及其子类Gallery画廊控件使用

在层次结构中找不到匹配的视图:可从类分配:类 android.widget.AdapterView

Android开发:ListViewAdapterViewRecyclerView全面解析

Android开发:ListViewAdapterViewRecyclerView全面解析