基于Java语言的安卓编程之十八Spinner控件

时间:2022-06-19 00:22:46

前一天学习了提高getView()效率的方法以及点击ListView子项显示指定内容的方法。通过getView()的convertView参数可以实现“旧”视图的使用而不必每次都要重新创建新视图,因而提高了该方法的效率。通过为ListView控件添加点击监视器的方法及Toast类实现了指定内容的显示。

今天将学习Spinner控件。Spinner控件用来显示一个下拉列表,用户可以在该列表中选择一项,之后在Spinner控件中显示。如图1所示。

基于Java语言的安卓编程之十八Spinner控件

图1 Spinner控件效果

1 Spinner控件基本用法

1.1 Spinner控件的添加

在界面布局文件中,通过添加如下代码实现Spinner控件的添加。

    <Spinner

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:id="@+id/my_spinner"

        />

以上代码指定了Spinner控件的宽度、高度和ID。

1.2 Spinner控件与数据的关联

1.2.1数据的确定

Spinner控件的数据可以通过values资源指定。在“Spinner->res->values”中添加一个名为“arrays.xml”的文件,在该文件中定义数据,如下所示。

    <string-arrayname="teams">

        <item>Milan</item>

        <item>Inter</item>

        <item>Lazzio</item>

        <item>Roma</item>

    </string-array>

其中,string-array表示定义的数据是字符串集合,name表示该集合的名称为teams,item表示集合中的项。

1.2.2 控件与数据的关联

在界面布局文件的添加Spinner控件的代码中,添加如下代码

android:entries="@array/teams"

其中,entries的作用是使用集合资源(arrays)设置该下拉列表框的列表项目,“@array/teams”表示使用arrays资源中的“teams”集合,即在1.2.1中定义的数据。

2 适配器与Spinner

Spinner控件的数据主要是通过适配器(Adapter)来实现的。可以用BaseAdapter类来表示与Spinner控件关联的适配器。BaseAdapter类的全称是android.widget.BaseAdapter,直接派生自java.lang.Object。之前提到到ArrayAdapter等都是它的子类。

2.1 适配器的定义

在MainActivity类中定义BaseAdapter类的对象。

    BaseAdapter ba = new BaseAdapter()

    {

}

BaseAdapter类从Adapter接口中继承了四个方法,分别是getCount()、getItem()、getItemId()和getView()。在定义的BaseAdapter类的对象中,需要对这四个类进行重载。

2.1.1 getCount()方法的重载

        publicint getCount()

       {

           return 10;

       }

其中,该方法的返回值指定了下拉菜单的项数,10表示下拉菜单有10项。

2.1.2 getItem()方法的重载

       @Override

       public Object getItem(int position)

       {

           returnnull;

       }

该方法的作用是获取指定位置的数据,参数position是指定的数据。

2.1.3 getItemId()方法的重载

       @Override

       publiclong getItemId(int position)

       {

           return 0;

       }

该方法的作用是获取列表中指定行的ID。

2.1.4 getView()方法的重载

该方法的作用是获取数据集合中指定位置的视图,返回值即为获取到的视图。而设置Spinner控件各项的“外观”,就是通过该方法实现的。

1      @Override

2   public View getView(int position, View convertView, ViewGroup

3                                 parent)

4      {

5          LinearLayoutline =new LinearLayout(MainActivity.this);

6       line.setOrientation(android.widget.LinearLayout.HORIZONTAL);

7          ImageViewimage =new ImageView(MainActivity.this);

8          image.setImageResource(R.drawable.flag);

9          TextViewtext =new TextView(MainActivity.this);

10         text.setText(position+"");

11         text.setTextSize(20);

12         line.addView(image);

13         line.addView(text);

14         return line;

15     }

其中,第1-4行重载了getView()函数,该函数的三个参数含义详见“基于Java语言的安卓编程ListView控件下”;第5行中通过new关键字定义了LinearLayout类的对象,该类的全称为android.widget.LinearLayout,派生自android.view.ViewGroup,可以在界面布局的单一行或者列上排列控件,MainActivity.this表示本程序的上下文;第6行中通过LinearLayout类的对象line调用其函数setOrientation()将控件排列方式设置为水平排列,在Spinner控件列表项中将包含一个ImageView控件和一个TextView控件,这两个控件的排列方式为水平排列,setOrientation()方法的参数取值为android.widget.LinearLayout.HORIZONTAL或者android.widget.LinearLayout.VERTICAL,分别表示水平排列和垂直排列;第7-8行定义了一个ImageView控件对象,并且通过setImageResource()方法设置了要显示的图像;9-11行定义了一个TextView控件对象,并通过setText()和setTextSize()方法设置了显示内容和字体的大小,其中第10行中的position是getView()方法的参数,表示Spinner控件列表项的行数;第12-13行,将ImageView控件和TextView控件加入到最开始定义的LinearLayout中;第14行,将LinearLayout类的对象line作为该方法的返回值返回。

2.2 适配器与Spinner控件的关联

在MainActivity类的onCreate()函数中,将适配器与Spinner控件进行关联。

    1   Spinner spinner = (Spinner)findViewById(R.id.my_spinner);

    2   spinner.setAdapter(ba);

其中,第1行中的R.id.my_spinner是Spinner控件的ID,在界面构造XML文件中指定;第2行中通过Spinner控件的setAdapter()方法设置控件的适配器,ba即为在2.1中定义的BaseAdapter类的对象。

3 小结

今天学习了Spinner控件的使用方法。Spinner控件的数据可以在values资源中指定,也可以通过适配器指定。在values资源中指定时,通过entries属性指定集合资源,使用适配器指定数据时,可以自定义BaseAdapter类的对象,在该对象中设置Spinner控件列表项的布局。