android提供的列表选择(Spinner)相当于网页上的下拉列表框,通常提供一些固定可选的项供用户去选择。
同样的 如果我们的数据来自于本地,我们可以用 entries属性去指定列表显示的内容。
android:prompt 可以指定Spinner的标题。
通过代码控制Spinner 的展示
mSpinner.performClick();
onNothingSelected方法的调用
当spinner展示的数据源变成空的的时候,会调用此方法
通过entries属性实现Spinner的显示
我们通过entries指定一个array数组内容显示到spinner中,同时用一个按钮去获取Spinner选中的项 。
在values文件夹下的strings.xml里面添加下面的内容,内容要放到标签里面
<array name="spinnerData">
<item>第1项</item>
<item>第2项</item>
<item>第3项</item>
<item>第4项</item>
<item>第5项</item>
<item>第6项</item>
<item>第7项</item>
</array>
然后我们写我们的xml布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_get_selection_item"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="获取选中项" />
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="50dp"
android:entries="@array/spinnerData" />
然后我们在java代码中添加Button的点击事件来获取选中的项的内容
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
//初始化控件
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//spinner.getSelectedItem()就是获取选中的item
Toast.makeText(MainActivity.this, ""+ spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
}
});
}
}
这样一个简单的Spinner就实现了。
通过ArrayAdapter适配器来显示内容
显示我们之前在strings.xml文件的写的数组内容
首先我们删掉xml文件中spinner下的 android:entries=”@array/spinnerData”这个属性
然后将上面initViews()方法中的代码改为:
//初始化控件
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//spinner.getSelectedItem()就是获取选中的item
Toast.makeText(MainActivity.this, ""+ spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
}
});
//创建适配器
ArrayAdapter<CharSequence> mAdapter = ArrayAdapter.createFromResource(this,R.array.spinnerData,android.R.layout.simple_dropdown_item_1line);
spinner.setAdapter(mAdapter);
这样也实现了我们上面的功能。
显示我们在java代码中定义的数组内容。
也是只需要将initViews()方法中的代码换为下面的即可:
//初始化一个string数组,放置spinner中要显示的内容
String [] data = new String[]{"我是1","我是2","我是3","我是4","我是5","我是6","我是7"};
//初始化控件
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//spinner.getSelectedItem()就是获取选中的item
Toast.makeText(MainActivity.this, ""+ spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
}
});
//如果你的jdk不是1.7或者以上,在new 的ArrayAdapter 的<>中,需要声明和前面的类型一致才行。
ArrayAdapter<String> mAdapter = new ArrayAdapter<>(this,android.R.layout.simple_spinner_item,data);
//设置列表框下拉时候的样式 mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(mAdapter);
我们用SimpleAdapter实现Spinner的复杂布局的显示
同样我们只修改我们的initViews()方法中的代码:
//初始化控件
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "" + spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
}
});
List<Map<String, String>> data = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("name", "刘亦菲");
map1.put("sex", "女");
Map<String, String> map2 = new HashMap<>();
map2.put("name", "李宇春");
map2.put("sex", "男");
Map<String, String> map3 = new HashMap<>();
map3.put("name", "王尼玛");
map3.put("sex", "");
data.add(map1);
data.add(map2);
data.add(map3);
//初始化ArrayAdapter 适配器
SimpleAdapter mAdapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[]{"name", "sex"}, //每行显示一组姓名和性别
new int[]{android.R.id.text1, android.R.id.text2});
//设置列表框下拉时候的样式
mAdapter.setDropDownViewResource(android.R.layout.simple_list_item_2);
spinner.setAdapter(mAdapter);//将适配器设置给ListView
不过这时候我们点击button的时候。获取的是一个json数据,要获取里面的内容就需要去解析json了。
我们修改按钮的点击事件里面的代码去解析json:
try {
JSONObject jo = new JSONObject(spinner.getSelectedItem().toString());
String name = jo.optString("name");
String sex = jo.optString("sex");
Toast.makeText(MainActivity.this, "选中了" + sex + " " + name, Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
这样我们就分别拿到了性别和姓名两个字段的值。
同理,我们可以用自己写的小布局去适配自己的数据。
自定义适配器去继承BaseAdapter去实现复杂布局
我们还是先贴我们的每一个item的xml文件
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="70dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="70dp"
android:orientation="horizontal">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/item_tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/item_tv_sex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
我们的布局文件:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_get_selection_item"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="获取选中项" />
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="70dp"
android:dropDownVerticalOffset="70dp"
/>
</LinearLayout>
我们的适配器为
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private Context mContext;
private List<Map<String, String>> data;
public MyAdapter(Context mContext, List<Map<String, String>> data){
this.mContext = mContext;
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return data.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if (view ==null){
holder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.list_item,null);
view.setTag(holder);
}else {
holder = (ViewHolder) view.getTag();
}
holder.mItemName = (TextView) view.findViewById(R.id.item_tv_name);
holder.mItemSex = (TextView) view.findViewById(R.id.item_tv_sex);
holder.mItemName.setText(data.get(i).get("name"));
holder.mItemSex.setText(data.get(i).get("sex"));
return view;
}
public class ViewHolder {
TextView mItemName;
TextView mItemSex;
}
}
我们的Activity为:
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
//初始化控件
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
//解析json
JSONObject jo = new JSONObject(spinner.getSelectedItem().toString());
String name = jo.optString("name");
String sex = jo.optString("sex");
Toast.makeText(MainActivity.this, "选中了" + sex + " " + name, Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
List<Map<String, String>> data = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("name", "刘亦菲");
map1.put("sex", "女");
Map<String, String> map2 = new HashMap<>();
map2.put("name", "李宇春");
map2.put("sex", "男");
Map<String, String> map3 = new HashMap<>();
map3.put("name", "王尼玛");
map3.put("sex", "");
data.add(map1);
data.add(map2);
data.add(map3);
//初始化MyAdapter 适配器
MyAdapter mAdapter = new MyAdapter(this,data);
spinner.setAdapter(mAdapter);//将适配器设置给ListView
}
}