zoukankan      html  css  js  c++  java
  • UI组件之AdapterView及其子类(三)Spinner控件具体解释

    Spinner提供了从一个数据集合中高速选择一项值的办法。

    默认情况下Spinner显示的是当前选择的值。点击Spinner会弹出一个包括全部可选值的dropdown菜单或者一个dialog对话框,从该菜单中能够为Spinner选择一个新值。

    这篇文章中我将讨论

    1.Spinner的基本使用方法 

    2.Spinner的xml属性

    3.设置Spinner的Adapter (antries属性,arrayadapter 和自己定义BaseAdapter) 


    最简单的Sipnner使用方法是使用spinner的android:antries属性直接使用arrays数组资源,显示一个下拉列表

    <?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="vertical">
        
    <!-- 这个spinner由entries提供值 -->
    
        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:dropDownWidth="200dp"
            android:entries="@array/province"
            android:prompt="@string/promp" />
    </LinearLayout>
    当中android:entries="@array/province"表示Spinner的数据集合是从资源数组province中获取的,province数组资源定义在values/arrays.xml中:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="province">
            <item >湖南省</item>
            <item >湖北省</item>
            <item >北京市</item>
            <item >上海市</item>       
        </string-array>
        
    </resources>
    


    当然。普通情况下我们是须要响应Spinner选择事件的,能够通过OnItemSelectedListener的回调方法实现

    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.spinner1);
            spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, 
                        int pos, long id) {
                
                    String[] languages = getResources().getStringArray(R.array.languages);
                    Toast.makeText(MainActivity.this, "你点击的是:"+province[pos], 2000).show();
                }
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // Another interface callback
                }
            });
        }
      
    }

    2.Spinner的xml属性


    android:entries: 直接在xml布局文件里绑定数据源(能够不设置。即能够在Activity中动态绑定)

    android:prompt:在Spinner弹出选择对话框( android:prompt="西游记人物")的时候对话框的标题:


    android:spinnerMode: Spinner的显示形式,它的值仅仅有“dialog”和“dropdown”两种,对话框和下拉列表的形式

    android:dropDownHorizontalOffset(setDropDownHorizontalOffset(int)):spinnerMode=”dropdown”时,下拉的项目选择窗体在水平方向相对于Spinner窗体的偏移量

    android:dropDownVerticalOffset(setDropDownVerticalOffset(int)):spinnerMode=”dropdown”时,下拉的项目选择窗体在垂直方向相对于Spinner窗体的偏移量。还能够引用一个资源(格式:@[package:]type:name)或者是包括这样的类型值的主题属性

    android:dropDownSelector:用于设定spinnerMode=”dropdown”时列表选择器的显示效果。它能够用”@[+][package]:type:name”格式来引用另外的资源。或者是用”?

    [package:][type:]name”的格式来 应用主题属性,还但是”#rgb”、”#argb”、”#rrggbb”、”aarrggbb”格式的颜色值

    android:dropDownWidth:在spinnerMode=”dropdown”时,设定下拉框的宽度。

    这个属性能够是带有单位的浮点型的尺寸值,如:14.5sp。

    有效的单位包含:px(像素)、dp(密度无关的像素)、sp(基于引用字体的尺寸来缩放的像素)、in(英寸)、mm(毫米)

    还能够是下列常量之中的一个:
    fill_parent = -1,下拉框的宽度应该使用屏幕的宽度来设定。这个常量从API Level 8開始被废弃了。而且使用mach_parent常量来取代。
    mach_parent = -1。下拉框的宽度应该使用屏幕的宽度来设定。在API Level 8中被引入。


    wrap_content = -2,下拉框的宽度应该跟它的内容相适应。


    android:gravity:这个属性用于设置当前选择的项目的对齐方式。

    android:popupBackground:在spinner=”dropdown”时,使用这个属性来设置下拉列表的背景。

    能够使用”@[+][package:]type:name”格式来引用另外的资源。或者使用”?

    [package:][type:]name”格式来应 用主题属性,也能够使用”#rgb”、”#argb”、”#rrggbb”、”#aarrggbb”格式的颜色值。


    3,Arrayadapter 设置Spinner的的适配器。提供列表项

    以下提供两个Spinner,第一个使用“下拉列表”。android:entries属性提供数组,第二个使用“dialog”形式,使用ArrayAdapter提供适配器

    main.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="vertical">
        
    <!-- 这个spinner由entries提供值 -->
    
        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:dropDownWidth="200dp"
            android:entries="@array/province"
            />
    
    <!-- 这个Spinner有adapter提供值 ,android:spinnerMode="dialog"下拉列表是以对话框的形式-->
    
        <Spinner
            android:id="@+id/spinner2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:popupBackground="#f00"
            android:spinnerMode="dialog"
            android:prompt="@string/promp" />
    
    </LinearLayout>
    MainActivity.java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //获取spinner布局文件里的Spinner组件
            Spinner sp=(Spinner) findViewById(R.id.spinner2);
            String[] arr={"唐僧","孙悟空","猪八戒","沙和尚"};
            //创建adapter对象
            ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);
            sp.setAdapter(aa);
                   
        }


    这是Spinner的标准用法。当中,有两行代码能够决定Spinner的外观:

     ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);
    第二个參数是Spinner未展开菜单时Spinner的默认样式。android.R.layout.simple_spinner_item是系统自带的内置布局。


    4,自己定义Adapter创建Spinner

    这样的情况适用于spinner比較复杂的情况,比方带有图标。
    以下我们定义一个选择联系人的Spinner。


    main.xml

     <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="80dip"
            android:orientation="vertical" >
          
            <Spinner
                android:id="@+id/spinner2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
              />
        </LinearLayout>
    Person.java

    package com.example.spinnerdemo;
      
    public class Person {
        private String personName;
        private String personAddress;
        public Person(String personName, String personAddress) {
            super();
            this.personName = personName;
            this.personAddress = personAddress;
        }
        public String getPersonName() {
            return personName;
        }
        public void setPersonName(String personName) {
            this.personName = personName;
        }
        public String getPersonAddress() {
            return personAddress;
        }
        public void setPersonAddress(String personAddress) {
            this.personAddress = personAddress;
        }
      
    }


    自己定义的MyAdapter.java

    package com.example.spinnerdemo;
     
    import java.util.List;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
      
    /**
     * 自己定义适配器类
     * @author jiangqq  <a href=http://blog.csdn.net/jiangqq781931404></a>
     *
     */
    public class MyAdapter extends BaseAdapter {
        private List<Person> mList;
        private Context mContext;
      
        public MyAdapter(Context pContext, List<Person> pList) {
            this.mContext = pContext;
            this.mList = pList;
        }
      
        @Override
        public int getCount() {
            return mList.size();
        }
      
        @Override
        public Object getItem(int position) {
            return mList.get(position);
        }
      
        @Override
        public long getItemId(int position) {
            return position;
        }
        /**
         * 以下是重要代码,每一项的布局是两个文本框,当然也能够加其它组件。这个就非常丰富了
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater _LayoutInflater=LayoutInflater.from(mContext);
            convertView=_LayoutInflater.inflate(R.layout.item_custom, null);
            if(convertView!=null) {
                ImageView imageView = (ImageView)convertView.findViewById(R.id.image);
                imageView.setImageResource(R.drawable.ic_launcher);
                TextView _TextView1=(TextView)convertView.findViewById(R.id.textView1);
                TextView _TextView2=(TextView)convertView.findViewById(R.id.textView2);
                _TextView1.setText(mList.get(position).getPersonName());
                _TextView2.setText(mList.get(position).getPersonAddress());
            }
            return convertView;
        }
    }
    MainActivity.java

         // 初始化控件
            Spinner spinner2  = (Spinner) findViewById(R.id.spinner2);
            // 建立数据源
            List<Person>  persons=new ArrayList<Person>();
            persons.add(new Person("张三", "上海 "));
            persons.add(new Person("李四", "上海 "));
            persons.add(new Person("王五", "北京" ));
            persons.add(new Person("赵六", "广州 "));
            //  建立Adapter绑定数据源
            MyAdapter _MyAdapter=new MyAdapter(this, persons);
            //绑定Adapter
            spinner2.setAdapter(_MyAdapter);




  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7087245.html
Copyright © 2011-2022 走看看