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) {

            }
        });
        
    }

}

 

posted @ 2016-04-24 16:21  ts-android  阅读(555)  评论(0编辑  收藏  举报