Spinner控件标准效果图:
使用ArrayAdapter适配Spinner
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:spinnerMode="dropdown">
</Spinner>
定义spinner, spinnerMode指定点击的效果,dropdown表示向下的列表,dialog的话就是弹出一个可下拉的对话框。
public class MainActivity extends AppCompatActivity {
private List<Person> list = new ArrayList<>();
private Spinner spinner;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) findViewById(R.id.spinner);
list.add(new Person("程序员1", 1));
list.add(new Person("程序员2", 2));
list.add(new Person("程序员3", 3));
list.add(new Person("程序员4", 4));
list.add(new Person("程序员5", 5));
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item,list);
spinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Person person = list.get(position);
Toast.makeText(MainActivity.this, "你点击的是" + person.getName(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
这里使用ArrayAdapter来适配spinner。 可以调用spinner.setOnItemSelectedListener()方法来响应点击的Item。ArrayAdapter构造的第二个参数是未展开的spinner样式。
spinner.setDropDownViewResource()中的样式是展开后的。
使用自定义BaseAdapter
创建需要的spinner样式:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:spinnerMode="dropdown">
</Spinner>
</LinearLayout>
创建对象类
public class Person {
private String name;
private int id;
public Person() {}
public Person(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
创建MyAdapter继承BaseAdapter
public class MyAdapter extends BaseAdapter {
private List<Person> mList;
private Context mContext;
private int resourceId;
public MyAdapter(List<Person> list, int resource, Context context) {
super();
mList = list;
mContext = context;
resourceId = resource;
}
@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) {
convertView = LayoutInflater.from(mContext).inflate(resourceId, null);
if(convertView != null) {
TextView id = (TextView) convertView.findViewById(R.id.id);
TextView name = (TextView) convertView.findViewById(R.id.name);
Person person = (Person) getItem(position);
id.setText(String.valueOf(person.getId()));
name.setText(person.getName());
}
return convertView;
}
}
构造函数传进去3个参数。 最重要的是重写getView()方法。
MainActivity代码
public class MainActivity extends AppCompatActivity {
private List<Person> list = new ArrayList<>();
private Spinner spinner;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) findViewById(R.id.spinner);
list.add(new Person("程序员1", 1));
list.add(new Person("程序员2", 2));
list.add(new Person("程序员3", 3));
list.add(new Person("程序员4", 4));
list.add(new Person("程序员5", 5));
MyAdapter adapter = new MyAdapter(list, R.layout.adapter_xml, this);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Person person = list.get(position);
Toast.makeText(MainActivity.this, "你点击的是" + person.getName(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
这里就没有setDropDownViewResource()方法。 样式都是传进去的样式。
spinner菜单显示形式:
android:spinnerMode = "dropdown";
android:spinnerMode = "dialog"
| dropdown | dialog |
Theme.Light 默认为弹出框的形式 |
|
|
Theme.Holo.Light 默认为下拉菜单的形式 |
|
|
Spinner一些属性
spinner.setDropDownVerticalOffset(int);
dropdown模式时,下拉的选择窗口相对于spinner在水平方向的偏移量。
spinner.dropDownVerticalOffset(int)
dropdown模式时,下拉的选择窗口相对于spinner在竖直方向的偏移量。
android:DropDownWidth(int)
spinner.setDropDownWidth(int);
dropdown模式时,设定下拉窗口的宽度。
android:popupBackground="#3C2F"
spinner=”dropdown”时,使用这个属性来设置下拉列表的背景。