0%

Android Spinner

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获取我们的内容。