3.3 适配视图基础
本节介绍适配器的基本概念,结合对下拉框Spinner的使用说明分别阐述数组适配器ArrayAdapter、简单适配器SimpleAdapter的具体用法与展示效果。
3.3.1 下拉框Spinner
Spinner是下拉框,用于从一串列表中选择某项,功能类似于单选按钮的组合。下拉列表的展示方式有两种,一种是在当前下拉框的正下方展示列表,此时把spinnerMode属性设置为dropdown;另一种是在页面中部以对话框形式展示列表,此时把spinnerMode属性设置为dialog。另外,Spinner还可以在代码中调用下列4个方法。
● setPrompt:设置标题文字。
● setAdapter:设置下拉列表的适配器。适配器可选择ArrayAdapter或SimpleAdapter。
● setSelection:设置当前选中哪项。注意该方法要在setAdapter方法后调用。
● setOnItemSelectedListener:设置下拉列表的选中监听器,该监听器要实现接口OnItemSelectedListener。
下面是一个自定义选中监听器的例子:
private String[] starArray = {"水星", "金星", "地球", "火星", "木星", "土星"}; private class MySelectedListener implements OnItemSelectedListener { public void onItemSelected(AdapterView<? > arg0, View arg1, int arg2, long arg3) { Toast.makeText(SpinnerDialogActivity.this, "您选择的是"+starArray[arg2], Toast.LENGTH_LONG).show(); } public void onNothingSelected(AdapterView<? > arg0) { } }
下面是使用Spinner控件的代码片段:
ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this, R.layout.item_select, starArray); starAdapter.setDropDownViewResource(R.layout.item_dropdown); Spinner sp = (Spinner) findViewById(R.id.sp_dialog); sp.setPrompt("请选择行星"); sp.setAdapter(starAdapter); sp.setSelection(0); sp.setOnItemSelectedListener(new MySelectedListener());
接下来看对话框模式的下拉效果,如图3-11所示。页面中部弹出六大行星的下拉列表;点击具体行星项后自动收起下拉列表,并且下拉框中的文字变更为刚选中的行星名称。
图3-11 dialog模式的下拉列表
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个参数放的是包装盒里塞糖果的位置与塞贺卡的位置。
下面是使用SimpleAdapter的示例代码:
int[] iconArray = {R.drawable.shuixing, R.drawable.jinxing, R.drawable.diqiu, R.drawable.huoxing, R.drawable.muxing, R.drawable.tuxing }; List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < iconArray.length; i++) { Map<String, Object> item = new HashMap<String, Object>(); item.put("icon", iconArray[i]); item.put("name", starArray[i]); list.add(item); } SimpleAdapter starAdapter = new SimpleAdapter(this, list, R.layout.item_select, new String[] { "icon", "name" }, new int[] { R.id.iv_icon, R.id.tv_name }); starAdapter.setDropDownViewResource(R.layout.item_simple);
下面是每个列表项的布局文件代码(包装盒):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/iv_icon" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:gravity="center"/> <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3" android:gravity="center" android:textSize="17sp" android:textColor="#ff0000"/> </LinearLayout>
敲了这么多代码,下面看一下加了图标的下拉列表的效果图,如图3-12所示。此时下拉列表左边显示行星的图片,右边显示行星的名称。
图3-12 带图标的下拉列表