Spinner-下拉列表
弹出的下拉列表的样式是由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) { } }); } }