弹出的下拉列表的样式是由Spinner的适配器的setDropDownViewResource()方法设置的。
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
String[] stringArray = getResources().getStringArray(R.array.ctype);//获取资源文件中spinner的选项
popupBackground 下拉菜单列表的背景
dropDownWidth 下拉菜单列表的宽度
spinner.setSelection(0, true);//设置选中哪个
android:spinnerMode="dialog" 在xml文件中设置下拉列表的弹出方式 dropdown 下拉模式
android:spinnerMode="dialog"
android:prompt="@string/spinner_title" //设置以对话框显示的时候的标题 如:spinner_title= 请选择 注意:不能直接写中文(写String.xml文件中)
spinner可以通过在xml中使用android:entries="@array/ctype"加载数据,需要在values中加入:(可自定义arrays.xml文件,也可以在String.xml中直接添加)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="colors">
<item>红色</item>
<item>橙色</item>
<item>黄色</item>
<item>绿色</item>
<item>蓝色</item>
<item>紫色</item>
</string-array>
</resources>
单击事件如下:
Spinner spinner=(Spinner) findViewById(R.id.spinner1);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
//列表选择框监听器
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
String sur=parent.getItemAtPosition(position).toString();//也可强制转化成Map集合,通过key获取每个item的值
System.out.println(sur);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub 什么都不选的方法
}
});
第二种方法就是加适配器(具体和List类似,见List) 使用系统布局
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.colors, android.R.layout.simple_spinner_item);
第三:使用自己的布局文件:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spinner=(Spinner) findViewById(R.id.spinner);
ArrayList<String> list=new ArrayList<String>();
list.add("1001");
list.add("1002");
list.add("1003");
list.add("1004");
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.spinner_item, R.id.textView1, list);
/*参数说明:ArrayAdapter只能为文本赋值,图文使用SimpleAdapter就可以了
* resource, 布局的id(这个布局必须包含一个TextView控件,可以有其他控件,只不过不能给其他的控件填充数据),这个布局就为spinner每个子条目的布局
* textViewResourceId, 上面那个布局中的textView控件的id,代表为这个id赋值,(其他控件没赋值就只能显示默认的值)
* objects 为上面textViewResourceId参数赋值的数据
*/
spinner.setAdapter(adapter);
}
}
布局文件activity_main.xml 就为一个textview和spinner控件
spinner的子条目布局文件spinner_item.xml:
<?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="match_parent"
android:orientation="horizontal" >
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:id="@+id/textView1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:id="@+id/textView2"
android:text="--没有赋值的textview"/>
</LinearLayout>
效果如下:
单击事件:(直接获取与监听获取)
/**
* Spinner下拉列表的使用:spinner的不能使用setOnItemClickListener设置监听
dataList.removeAll(dataList);//清空数据
dataList.addAll(newData);//添加数据
arrayAdapter.notifyDataSetChanged();//通知跟新数据
下面以SimpleAdapter的监听为例:
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
Map<String, Object> map = null;
final ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 5; i++) {
map = new HashMap<String, Object>();
map.put("text", "文本" + i);
map.put("img", R.drawable.ic_launcher);
list.add(map);
}
final SimpleAdapter adapter = new SimpleAdapter(this, list,R.layout.spinner_item,
new String[] { "img", "text" },
new int[] { R.id.img, R.id.textView1 });
spinner.setAdapter(adapter);
// 根据Spinner对象直接取得当前选择的Item内容
// getSelectedItem得到的对象为object,代表着List的泛型的类型,所以一般都是强转为适配器数据类型的泛型的类型
Map<String, Object> item = (Map<String, Object>) spinner.getSelectedItem();
//这样得到的就是往map里put添加的数据
System.out.println(item.get("img") + "--" + item.get("text").toString());//图片id -- textview内容
//设置监听实时获取选中项
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 第一种方式: 强转为适配器数据类型的泛型的类型
Map<String, Object> item = (Map<String, Object>) parent.getItemAtPosition(position);
System.out.println("监听1:" + item.get("text"));
// 第二种方式:
item = (Map<String, Object>) spinner.getItemAtPosition(position);
System.out.println("监听2:" + item.get("text"));
// 3.从数据源获取
item = list.get(position);
System.out.println("监听3:" + item.get("text"));
// 4.从adapter去获取
item = (Map<String, Object>) adapter.getItem(position);
System.out.println("监听4:" + item.get("text"));
}
@Override
// 没有选择的时候调用
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}