spinner的详情及扩展 https://www.cnblogs.com/plokmju/p/android_Spinner.html
1.Spinner的常用XML属性
- android:spinnerMode:dialog和dropDown两种模式,默认为下拉列表。
- android:entries:使用<string-array…/>资源配置数据源。
- android:prompt:设置标题,仅在dialog模式下有效。
2.Spinner的触发事件
它本身没有定义这些事件,均继承自间接父类AdapterView。
- AdapterView.OnItemCLickListener:列表项被点击时触发。
- AdapterView.OnItemLongClickListener:列表项被长按时触发。
- AdapterView.OnItemSelectedListener:列表项被选择时触发。
AdapterView.OnItemSelectedListener有四个参数。
AdapterView<?> parent:适配器的一个指针,适配器中有多个item,parent表示当前选中的那个item。
View view:通过view获取item中的控件。
int position:在适配器中的位置。
long id :id和position的值通常是一样的。id=adapter.getItemId(position)
3.Spinner数据源的设置
-
通过xml资源文件设置,缺点是设置的数据是固定的,不是动态的。
-
使用Adapter接口设置,这是最常见的方式,动态、灵活,可以设定各种样式以及数据来源。
xml资源文件设置
新建资源文件:右击app/res/values-->new-->XML-->values XML file-->strings.xml
<string name="spinnerTitle">操作</string> //string标签设置字符串,name是变量名,操作是变量的值
//string-array标签设置数组,name是数组名,item是数组中的值 <string-array name="operate"> <item>求和</item> <item>总数</item> <item>平均数</item> </string-array>
xml文件结构:
- 在strings.xml中设置好数据后,spinner控件使用android:entries="@array/operate"获取数组的数据, android:prompt="@string/spinnerTitle"获取字符串的值
设置适配器Adapter
1.设置一个ArrayList存放显示的数据。
2.创建一个ArrayAdapter。
ArrayAdapter adapter = new ArrayAdapter(Context context, android.R.layout.simple_spinner_item,ArrayList datalist);
第一个参数:上下文环境,当前的activity。
第二个参数:这个是安卓内置的布局,它是一个textview,datalist的数据通过textview.setText()显示。也可以自己定义布局用来显示datalist的数据。
第三个参数:存放数据的集合。
spinner的原理就是,遍历datalist里面的每一条数据,读出一条,显示到第二个参数对应的布局中,就形成了spinner下拉出现多个数据
3.关联适配器和spinner控件。
获取spinner控件:spinnerDown = (Spinner) findViewById(R.id.spinnerDown);
spinnerDown.setAdapter(adapter);
4.效果图
下滑的spinner
弹出对话框的spinner
选择“平均数”这个选项会在下面的textview显示选择的内容
5.代码
MainActivity.java
private Spinner spinnerDown,spinnerDialog;
private TextView textShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinnerDown = (Spinner) findViewById(R.id.spinnerDown);
spinnerDialog = (Spinner) findViewById(R.id.spinnerDialog);
textShow=(TextView)findViewById(R.id.textShow);
// 声明一个ArrayAdapter用于存放简单数据
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
MainActivity.this, android.R.layout.simple_spinner_item,
getData());
// 把定义好的Adapter设定到spinner中
spinnerDown.setAdapter(adapter);
// 为第一个Spinner设定选中事件
spinnerDialog.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 在选中之后触发
String opt=parent.getItemAtPosition(position).toString();
textShow.setText(opt);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
textShow.setText("");
}
});
spinnerDown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 在选中之后触发
textShow.setText(parent.getItemAtPosition(position).toString());
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
textShow.setText("");
}
});
}
private List<String> getData() {
// 数据源
List<String> dataList = new ArrayList<String>();
dataList.add("北京");
dataList.add("上海");
dataList.add("南京");
dataList.add("宜昌");
return dataList;
}
activity_main.xml
<Spinner
android:id="@+id/spinnerDown"
android:prompt="@string/spinnerTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:spinnerMode="dropdown" />
<Spinner
android:id="@+id/spinnerDialog"
android:layout_marginTop="100dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/operate"
android:prompt="@string/spinnerTitle"
android:spinnerMode="dialog" />
<TextView
android:id="@+id/textShow"
android:layout_marginTop="100dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
strings.xml
<resources>
<string name="app_name">mySpinner</string>
<string name="spinnerTitle">操作</string>
<string-array name="operate">
<item>求和</item>
<item>总数</item>
<item>平均数</item>
</string-array>
</resources>