前一天学习了提高getView()效率的方法以及点击ListView子项显示指定内容的方法。通过getView()的convertView参数可以实现“旧”视图的使用而不必每次都要重新创建新视图,因而提高了该方法的效率。通过为ListView控件添加点击监视器的方法及Toast类实现了指定内容的显示。
今天将学习Spinner控件。Spinner控件用来显示一个下拉列表,用户可以在该列表中选择一项,之后在Spinner控件中显示。如图1所示。
图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控件列表项的布局。