Spinner:可以理解为一个数据集合的菜单。


定义数组资源的方法:
Spinner实现方法:
方法一(最简单的,使用默认的适配器):
1.先拖进去一个Spinner控件
2.在strings资源文件中,添加一个string-array数组,但是,这个数组要给name标签。
3.在Spinner控件中添加entries属性,使用@array/name的方式,加载定义好的数组,或者获取string—array的数组资源
方法二(最常用的,自己定义适配器):
1.先拖进去一个Spinner控件
2.获取数组资源(同上)
3.自定义适配器
4.设置适配器到Spinner控件上
效果图:

效果图:

Spinner如果不设置模式,默认采用下拉列表的模式即
android:spinnerMode="dropdown"
也可自己设置为dialog模式显示
android:spinnerMode="dialog"
定义数组资源的方法:
1.数组资源定义在values/arrays.xml中(一般用于资源为固定的,只能通过升级软件来改变数组资源)。通过xml中给Spinner添加android:entries属性绑定;或者通过在java代码中getResources().getStringArray()来获取(通过R.array.+资源数组名):
<resources>
<string name="app_name">Spinner</string>
<string-array name="province">
<item>安徽省</item>
<item>河北省</item>
<item>河南省</item>
<item>湖北省</item>
<item>湖南省</item>
</string-array>
</resources>
<Spinner
android:entries="@array/province"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/spinner"
android:layout_centerInParent="true"
android:layout_marginTop="64dp"/>
//获取资源文件,通过array资源获取name为province的数组
String[] stringArray = getResources().getStringArray(R.array.province);
2.在java代码中添加数组资源,直接采用赋值的形式,然后用到时引用就行(一般用于数据经常变动时,可以通过网络请求数据)。
private String[] province = {"安徽省","河北省","河南省","湖北省","湖南省"};
Spinner实现方法:
方法一(最简单的,使用默认的适配器):
1.先拖进去一个Spinner控件
2.在strings资源文件中,添加一个string-array数组,但是,这个数组要给name标签。
3.在Spinner控件中添加entries属性,使用@array/name的方式,加载定义好的数组,或者获取string—array的数组资源
方法二(最常用的,自己定义适配器):
1.先拖进去一个Spinner控件
2.获取数组资源(同上)
3.自定义适配器
4.设置适配器到Spinner控件上
Spinner实现之方法一:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
spinner = (Spinner) findViewById(R.id.spinner);
// //获取资源文件,通过array资源获取name为province的数组
// String[] stringArray = getResources().getStringArray(R.array.province);
// spinner = (Spinner) findViewById(R.id.spinner2);
// //新建一个数组适配器ArrayAdapter设置三个参数:上下文,下拉列表的样式,数据源
// ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, stringArray);
// //将适配器设置给Spinner
// spinner.setAdapter(adapter);
//设置item的被选择的监听
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
//当item被选择后调用此方法
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//获取我们所选中的内容
String s = parent.getItemAtPosition(position).toString();
//弹一个吐司提示我们所选中的内容
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
}
//只有当patent中的资源没有时,调用此方法
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.zhiyuan3g.spinner.MainActivity">
<!--注意entries属性,是添加资源,这样java代码中就不需要进行添加资源的操作。
当然,你也可以在java代码中做添加资源的操作-->
<Spinner
android:entries="@array/province"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/spinner"
android:layout_centerInParent="true"
/>
</RelativeLayout>
strings.xml
<resources>
<string name="app_name">Spinner</string>
<string-array name="province">
<item>安徽省</item>
<item>河北省</item>
<item>河南省</item>
<item>湖北省</item>
<item>湖南省</item>
</string-array>
</resources>
效果图:
Spinner实现之方法二:
MainActivity.java
package com.zhiyuan3g.spinner;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;
import com.zhiyuan3g.spinner.adapter.MyAdapter;
public class MainActivity extends AppCompatActivity {
private Spinner spinner;
//定义了两个数组,一个存放图片,一个存放省份
private int[] image = {R.drawable.anhui, R.drawable.hebei,
R.drawable.henan, R.drawable.hubei, R.drawable.hunan};
private String[] province = {"安徽省","河北省","河南省","湖北省","湖南省"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
//控件初始化
spinner = (Spinner) findViewById(R.id.spinner);
//自定义适配器,将其设置给spinner
spinner.setAdapter(new MyAdapter(image,province,this));
//设置监听
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
//当item被选择后调用此方法
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//获取我们所选中的内容
String s = province[position];
//弹一个吐司提示我们所选中的内容
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
}
//只有当patent中的资源没有时,调用此方法
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
MyAdapter.java
package com.zhiyuan3g.spinner.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.zhiyuan3g.spinner.R;
public class MyAdapter extends BaseAdapter {
private int[] image;
private String[] province;
private Context context;
private ViewHolder mViewHolder;
/**
* function:通过构造方法传递数据
* @param image:图片数据
* @param province:省份数据
* @param context:上下文
*/
public MyAdapter(int[] image, String[] province, Context context) {
this.image = image;
this.province = province;
this.context = context;
}
//item的总长度
@Override
public int getCount() {
return image.length;
}
//获取item的标识
@Override
public Object getItem(int position) {
return position;
}
//获取item的id
@Override
public long getItemId(int position) {
return position;
}
//获取item视图
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//判断是否有可复用的view对象,没有的话走if,有的话走else
if (convertView==null){
//找到我们自定义的行布局
convertView = View.inflate(context, R.layout.layout_item, null);
//实例化ViewHolder内部类
mViewHolder = new ViewHolder();
//给ViewHolder里的控件初始化,通过我们自定义的行布局
mViewHolder.picture = (ImageView) convertView.findViewById(R.id.picture_img);
mViewHolder.province = (TextView) convertView.findViewById(R.id.province_tv);
//给convertView设置一个标签
convertView.setTag(mViewHolder);
}else {
//获取我们设置过的标签,实现复用convertView
mViewHolder = (ViewHolder) convertView.getTag();
}
//分别给每个控件设置相应的内容
mViewHolder.province.setText(province[position]);
mViewHolder.picture.setImageResource(image[position]);
//返回convertView对象
return convertView;
}
//新建ViewHolder内部类,用来定义我们行布局中所用到的控件
class ViewHolder{
private ImageView picture;
private TextView province;
}
}
layout_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:id="@+id/picture_img"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:id="@+id/province_tv"
android:layout_marginTop="10dp"
android:layout_height="wrap_content"/>
</LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.zhiyuan3g.spinner.MainActivity">
<!--注意entries属性,是添加资源,这里我们不用,而是在代码中添加-->
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/spinner"
android:layout_centerInParent="true"
/>
</RelativeLayout>
效果图: