第6讲用户界面(3)——绑定类组件AdapterView一、Android中AdapterView组件和适配器Adapter关系详解绑定类控件包括列表Listview、下拉菜单Spinner,拖动效果Gallery,网格视图GridView等类型,这些组件中的数据是要通过适配器类绑定到组件上。最典型的例子是ListView。AdapterView的类主要结构如下:AdapterView组件一般是显示一系列的数据,比如如数组,链表,数据库,集合等。在显示数据时,需要用到适配器类Adapter配合使用,为AdapterView提供数据来源。查帮助文档android.widget.AdapterAnAdapterobjectactsasabridgebetweenanAdapterViewandtheunderlyingdataforthatview.TheAdapterprovidesaccesstothedataitems.TheAdapterisalsoresponsibleformakingaViewforeachiteminthedataset.Adapter适配器组件的继承结构如下:除自定义的适配器外,我们常用的适配器一共有三个,这三个常用的适配器是ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,他们都是继承于BaseAdapter。Adapter是一个抽象类,在具体的适配器子类里面它实现了父类的这几个重要的方法:ViewViewGroupAdapterViewListViewGridViewSpinnerGalleryObjectAdapterBaseAdapterArrayAdapterCursorAdapterSimpleAdapterResourceCursorAdapterSimpleCursorAdapterpublicintgetCount()//得到数据的行数publicObjectgetItem(intposition)//根据position得到某一行的记录publiclonggetItemId(intposition)//的到某一条记录的IDpublicViewgetView(intposition,ViewconvertView,ViewGroupparent)//这个方法是相比于其它几个方法最重要的,它显式的定义了适配器将要以什么样的方式去显示我们所填充的数据,在自定义的适配器里面我们通常会给它写个布局文件。(1)BaseAdapter是Android应用程序中经常用到的基础数据适配器,是一个抽象类,其他的适配器就是基础自这个适配器。(2)SimpleCursorAdapter一般主要用于数据库,它的数据来源一般都是数据库查询得到的Cursor,简单的纯文字型的ListView,它需要将Cursor的字段和UI的id对应起来,方便的把数据库的内容以列表的形式展现出来(3)ArrayAdapterArrayAdapter:支持泛型操作,列表内容可以是数组,也可以是List对象,是最简单的适配器,专门用于简单的列表控件,只能显示一行字。缺点:显示内容单一,不够灵活。构造函数:ArrayAdapter(Contextcontext,intresource,inttextViewResourceId,ListTobjects)第一个参数是this,第二个参数是布局文件(系统定义好的一个基本的ListView的显示选项或者Spinner的显示选项,上面只支持显示一行文字),这个布局文件也可以自己定义,第三个参数是数据源。Spinnersp=(Spinner)this.findViewById(R.id.sp_position);String[]positions={…};ArrayAdapterarrayAdapter=newArrayAdapter(this,android.R.layout.simple_spinner_dropdown_item,positions);sp.setAdapter(arrayAdapter);(4)SimpleAdapter可以实现较为复杂的自定义列表选项,具有最好的扩充性(而无需自定义适配器),比如图片+文字,还可以放上按钮,复选框等等,只需要为列表选项去设计一个界面布局文件。查帮助文档,构造函数:SimpleAdapter(Contextcontext,List?extendsMapString,?data,intresource,String[]from,int[]to)contextThecontextwheretheViewassociatedwiththisSimpleAdapterisrunningdataAListofMaps.EachentryintheListcorrespondstoonerowinthelist.TheMapscontainthedataforeachrow,andshouldincludealltheentriesspecifiedinfromresourceResourceidentifierofaviewlayoutthatdefinestheviewsforthislistitem.ThelayoutfileshouldincludeatleastthosenamedviewsdefinedintofromAlistofcolumnnamesthatwillbeaddedtotheMapassociatedwitheachitem.toTheviewsthatshoulddisplaycolumninthefromparameter.TheseshouldallbeTextViews.ThefirstNviewsinthislistaregiventhevaluesofthefirstNcolumnsinthefromparameter.每个参数的含义:context:上下文,一般是thisdata:是准备放入列表的数据集合,是一个List?extendsMapString,?类型的集合对象,即List集合中存放的是一个个的Map对象,该集合中每个MapString,?对象生成一个列表项。resource:界面布局的ID,即每个列表选项的界面布局的IDfrom:是MapString,?对象中的key组成的String数组,决定提取MapString,?对象中哪些key对应的value来生成列表to:是布局文件中的组件ID组成的int类型的数组,决定使用哪些View组件来组合成一个列表项SimpleAdaptersimpleAdapter=newSimpleAdapter(this,data,R.layout.item,newString[]{icon,name,tel},newint[]{R.id.iv_icon,R.id.tv_name,R.id.tv_phonenumber});二、ListView1、ListView界面的设定将元素按照条目的方式自上而下的列出来,有多条数据,ListView会自动添加向下滚动,通过前面的分析,要实现ListView,必须采用一个适配器,这里使用ArrayAdapter和SimpleAdapter例1、使用ArrayAdapter来实现一个简单的列表,将新闻标题显示出来RelativeLayoutxmlns:android=:tools=:layout_width=match_parentandroid:layout_height=match_parentandroid:paddingBottom=@dimen/activity_vertical_marginandroid:paddingLeft=@dimen/activity_horizontal_marginandroid:paddingRight=@dimen/activity_horizontal_marginandroid:paddingTop=@dimen/activity_vertical_margintools:context=com.example.listviewdemo_6.NewsListActivityListViewandroid:id=@+id/lv_newsandroid:layout_width=match_parentandroid:layout_height=wrap_content/ListView/RelativeLayoutpublicclassNewsListActivityextendsActivity{ListViewlv_news;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_news_list);//准备数据源String[]data=newString[]{生鲜电商:市场混乱尚未统一,陷入七种模式之争科技大事件,ARWatch应用带你提前体验AppleWatch};//准备适配器ArrayAdapterarrayAdapter=newArrayAdapter(this,android.R.layout.simple_list_item_activated_1,data);lv_news=(ListView)this.findViewById(R.id.lv_news);lv_news.setAdapter(arrayAdapter);//适配器和组件绑定到一起}例2、使用SimpleAdapter来实现一个显示通讯录的ListView,要求左边有联系人的照片,右边分两栏,上面显示联系人名字,下面显示联系人的电话号码。步骤1、设计主界面,里面有一个ListViewRelativeLayoutxmlns:android=:tools=:layout_width=match_parentandroid:layout_height=match_parentandroid:paddingBottom=@dimen/activity_vertical_marginandroid:paddingLeft=@dimen/activity_horizontal_marginandroid:paddingRight=@dimen/activity_horizontal_marginandroid:paddingTop=@dimen/activity_vertical_margintools:context=com.example.listviewdemo_6.NewsListActivityListViewandroid:id=@+id/lv_newsandroid:layout_width=match_parentandroid:layout_height=wrap_content/ListView/RelativeLayout步骤2、设计一个存放选项的界面item.xml?xmlversion=1.0encoding=utf-8?LinearLayoutxmlns:android=:layout_width=match_p