转自:http://www.blogjava.net/crazycoding/archive/2011/07/09/353981.html
android里的Spinner其实就是个ComboBox =。=
一。基本使用方法:main.xml 不多解释
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< Spinner
android:id = "@+id/mySpinner"
android:layout_width = "fill_parent"
android:layout_height ="wrap_content"
/>
</ LinearLayout >
在string.xml中使用“string-array”定义数据源。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">MySpinnerDemo</string>
<string-array name = "phones_array">
<item>iPhone</item>
<item>Android</item>
<item>BlackBerry</item>
</string-array>
</resources>
Activity类:
package com.yinger;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
/**
* Spinner Demo
* @author Yinger
* @time 2011-7-9 下午01:54:59
* @mail melody.crazycoding@gmail.com
*/
public class SpinnerDemo extends Activity {
Spinner spinner = null;
String selected = "0";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
spinner = (Spinner)findViewById(R.id.mySpinner);
initMySpinner();
}
private void initMySpinner() {
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.phones_array,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setPrompt("test");
spinner.setOnItemSelectedListener(new SpinnerOnSelectedListener());
}
class SpinnerOnSelectedListener implements OnItemSelectedListener{
public void onItemSelected(AdapterView<?> adapterView, View view, int position,
long id) {
// TODO Auto-generated method stub
selected = adapterView.getItemAtPosition(position).toString();
System.out.println("selected===========>" + selected);
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
System.out.println("selected===========>" + "Nothing");
}
}
}
二。debug发现的一个小问题:
Spinner在初始化时会自动调用一次OnItemSelectedListener事件
原因:有人说是Bug,其实这与C#的事件机制类似,懒得说了=。=
提供的解决办法:
个人是通过在事件注册之前调用
spinner.setSelection(0, true);
但要注意,使用此方法,如果用户选择的也是第一项,那么OnItemSelectedListener事件不会被触发……
三。使用技巧
1.动态添加Spinner的数据源
修改initMySpinner方法,代码如下:
private void initMySpinner() {
String[] phones = {"iPhone","Android","BlackBerry"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, android.R.layout. simple_spinner_item,
phones);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setPrompt("test");
spinner.setSelection(0, true);
spinner.setOnItemSelectedListener(new SpinnerOnSelectedListener());
}
2.自定义Spinner的Layout,替换掉体统默认的android.R.layout.simple_spinner_item
super easy
my_spinner_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12dip"
android:textColor="#FF8B1500"
android:gravity="center" />
修改adapter:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, R.layout.my_spinner_item,
phones);
同理,可自定义layout,替换掉android.R.layout.simple_spinner_dropdown_item
3.同时显示图片和文本
自定义Adapter:
package com.yinger;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* 自定义Adapter
* @author Yinger
* @time 2011-7-9 下午03:39:34
* @mail melody.crazycoding@gmail.com
*/
public class MyAdapter extends BaseAdapter {
private Context ctx;
private int drawableIDs[];
private int stringIDs[];
public MyAdapter(Context ctx, int DrawableIDs[], int StringIDs[])
{
this.ctx = ctx;
this.drawableIDs = DrawableIDs;
this.stringIDs = StringIDs;
}
public int getCount() {
// TODO Auto-generated method stub
return drawableIDs.length ;
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return drawableIDs [position];
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LinearLayout ll = new LinearLayout( ctx );
ll.setOrientation(LinearLayout. HORIZONTAL );
ll.setGravity(Gravity. CENTER_VERTICAL );
ImageView iv = new ImageView( ctx );
iv.setImageResource( drawableIDs [position]);
iv.setLayoutParams( new ViewGroup.LayoutParams(100, 40));
ll.addView(iv);
TextView tv = new TextView( ctx );
tv.setText( stringIDs [position]);
tv.setTextSize(14);
tv.setTextColor(Color.BLUE );
ll.addView(tv);
return ll;
}
}
修改initMySpinner方法:
private void initMySpinner() {
int[] phonePics = {R.drawable.apple,R.drawable.android,R.drawable.blackberry};
int[] phones = { R.string.iphone, R.string.android, R.string.blackberry};
MyAdapter adapter = new MyAdapter(this,phonePics,phones);
spinner.setAdapter(adapter);
spinner.setPrompt("test");
spinner.setSelection(0, true);
}
运行结果截图:
OK,但使用自定义的Adapter,我们如何来获取选中的文本信息呢?
在MyAdapter中,修改getView方法,添加黄色区域代码如下:
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LinearLayout ll = new LinearLayout( ctx );
ll.setOrientation(LinearLayout. HORIZONTAL );
ll.setGravity(Gravity. CENTER_VERTICAL );
ImageView iv = new ImageView( ctx );
iv.setImageResource( drawableIDs [position]);
iv.setLayoutParams( new ViewGroup.LayoutParams(100, 40));
ll.addView(iv);
TextView tv = new TextView( ctx );
tv.setText( stringIDs [position]);
tv.setTextSize(14);
tv.setTextColor(Color.BLUE );
tv.setTag( "tagTextView" );
ll.addView(tv);
return ll;
}
重写事件中的onItemSelected方法:
// TODO Auto-generated method stub
public void onItemSelected(AdapterView<?> adapterView, View view, int position,
long id) {
if(adapterView.getId() == R.id.mySpinner)
{
LinearLayout ll = (LinearLayout)view;
TextView tv = (TextView)ll.findViewWithTag( "tagTextView" );
String str = (String)tv.getText();
System.out.println("selected===========>" + str);
}
}
最后,别忘了注册该事件。=。=