Spinner控件
就是一个下拉列表的控件,供用户选择内容的。这个东西也是需要一个适配器的,就和我们之前用到的那个提示文本框一样。
预定义适配器
就是安卓为了开发的方便,给我们提供了一些安卓自定义的一些控件。
1 2 3
| String[] strArr = new String[]{"Wker","Wker帅","Wker酷"}; ArrayAdapter<String> Adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked,strArr); sp1.setAdapter(Adapter);
|
这个理解起来比较简单,就是我们先配置一个数组,然后适配器的第一个参数是一个上下文,第二个参数是布局,我们这里用的是预定义的,第三个参数就是我们需要填写的内容,最后我们将这个给下拉列表框设置上去。
自定义布局适配器
这个比较好用,我感觉后期开发经常用得到,就是我们通过自己的布局文件加载这个选项。
首先我们先布局一个layout
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical"> <ImageView android:id="@+id/ImageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/TextView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Test" />
</LinearLayout>
|
这个布局使我们用来设置下拉列表框的一个布局的。然后我们编写java代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| List<Map<String,Object>> MyList = new ArrayList<Map<String,Object>>(); Map<String,Object> map1 = new HashMap<String, Object>(); map1.put("icon", R.drawable.ic_launcher); map1.put("Text", "Wker"); MyList.add(map1);
Map<String,Object> map2 = new HashMap<String, Object>(); map2.put("icon", R.drawable.ic_launcher); map2.put("Text", "Ws"); MyList.add(map2);
SimpleAdapter Adapter1 = new SimpleAdapter(this, MyList, R.layout.my_sp, new String[]{"icon","Text"}, new int[]{R.id.ImageView1,R.id.TextView1}); sp2.setAdapter(Adapter1);
|
这个东西看着有点复杂,其实也是比较好理解的。
首先我们先定义一个集合,这个集合承载的一些map,这些map是用String对应Object的。
然后我们向这个List里面添加我们的map,这里需要对应好,因为我们的Value是Object,所以可以是所有类型,我们添加好之后,然后初始化我们的适配器,SimpleAdapter的构造函数,第一个就是我们的上下文,第二个是布局文件,第三个是map中Key的值作为一个数组传进去,也就是表项字段的值,最后一个参数就是我们Value在布局文件中的一个对应id。其实我们看这个参数名称也能看出来最后两个,分别是from和to,体会一下就知道了。
这里需要注意的是,List中有多少个map就会有多少个选择项,map对应的就是有几列。
添加一个点击事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| sp2.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Spinner sp = (Spinner)parent; @SuppressWarnings("unchecked") Map<String,Object> map = (Map<String, Object>) sp.getItemAtPosition(position); MainActivity.this.setTitle((CharSequence) map.get("Text")); }
@Override public void onNothingSelected(AdapterView<?> parent) { } });
|
这个的话呢就是比较好理解了,首先我们现将我们的触发源强制转换成我们的Spinner对象,然后getItem通过传进来的position,因为我们知道是map,所以这里可以强转,@SuppressWarnings("unchecked")
这个注解就是告诉编译器,这个强制转换的警告就不要提示了。最后我们在通过map获取我们的内容。