3.3 适配视图基础
本节介绍适配器的基本概念,结合对下拉框Spinner的使用说明分别阐述数组适配器ArrayAdapter、简单适配器SimpleAdapter的具体用法与展示效果。
3.3.1 下拉框Spinner
Spinner是下拉框,用于从一串列表中选择某项,功能类似于单选按钮的组合。下拉列表的展示方式有两种,一种是在当前下拉框的正下方展示列表,此时把spinnerMode属性设置为dropdown;另一种是在页面中部以对话框形式展示列表,此时把spinnerMode属性设置为dialog。另外,Spinner还可以在代码中调用下列4个方法。
- setPrompt:设置标题文字。
- setAdapter:设置下拉列表的适配器。适配器可选择ArrayAdapter或SimpleAdapter。
- setSelection:设置当前选中哪项。注意该方法要在setAdapter方法后调用。
- setOnItemSelectedListener:设置下拉列表的选择监听器,该监听器要实现接口OnItemSelectedListener。
下面是一个下拉框调用选择监听器的代码例子:
图3-11 dialog模式的下拉列表
接下来看对话框模式的下拉效果,如图3-11所示。页面中部弹出六大行星的下拉列表;点击具体行星项后自动收起下拉列表,并且下拉框中的文字变更为刚选中的行星名称。
3.3.2 数组适配器ArrayAdapter
前面在演示Spinner时用到了setAdapter方法设置适配器。这个适配器好比一组数据的加工流水线,你丢给它一大把糖果,适配器把糖果排列好顺序,然后拿来制作好的包装盒,把糖果往里面一塞,出来的便是一个个精美的糖果盒。这个流水线可以做得很复杂,也可以做得简单一些,最简单的流水线就是之前演示Spinner用到的ArrayAdapter。
ArrayAdapter主要用于每行列表只展示文本的情况,有两道工序,第一道工序是构造函数,除了提供一堆原始数据外(六大行星的名称列表),还可以指定下拉框当前文本的包装盒,即下面这行代码里的R.layout.item_select,这个布局文件内只有一个TextView,定义了当前选中文本的大小、颜色、对齐方式等属性。
// 声明一个下拉列表的数组适配器 ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this, R.layout.item_select, starArray);
第二道工序是定义下拉列表的包装盒,即下面代码里的R.layout.item_dropdown,定义了对话框列表中每行文本的显示属性。
// 设置数组适配器的布局样式 starAdapter.setDropDownViewResource(R.layout.item_dropdown);
经过这两道工序,ArrayAdapter就明确了原料糖果的分拣过程与包装方式,接下来只待Spinner调用setAdapter方法发出开动机器指令,适配器便会把一个一个包装好的糖果盒输出到屏幕界面。
3.3.3 简单适配器SimpleAdapter
ArrayAdapter只能显示文本列表,显然不够美观,有时我们还想给列表加上图标,比如六大行星是否分别显示星球的小图。这时SimpleAdapter就派上用场了,它允许在列表项中展示多个控件,包括文本与图片。
SimpleAdapter的实现略微复杂,除了第二道工序与ArrayAdapter一样外,第一道工序需要更多信息。例如,原料不但有糖果,还有贺卡,这样就得把一大袋糖果和一大袋贺卡送进流水线,适配器每次拿一颗糖果和一张贺卡,把糖果与贺卡按规定塞进包装盒。对于SimpleAdapter的构造函数来说,第二个参数Map容器放的是原料糖果与贺卡,第3个参数放的是包装盒,第4个参数放的是糖果袋与贺卡袋的名称,第5个参数放的是包装盒里塞糖果的位置与塞贺卡的位置。
下面是下拉框Spinner使用SimpleAdapter的示例代码:
下面是每个列表项的布局文件内容(包装盒):
图3-12 带图标的下拉列表
敲了这么多代码,下面看一下加了图标的下拉列表的效果图,如图3-12所示。此时下拉列表左边显示行星的图片,右边显示行星的名称。