一:从服务器获取字典值并保存
1:创建一个实体类Dict,dictCode用于保存字典值,dictName用于保存字典名称
package com.example.test;
public class Dict {
public String dictCode;
public String dictName;
public String getDictCode() {
return dictCode;
}
public void setDictCode(String dictCode) {
this.dictCode = dictCode;
}
public String getDictName() {
return dictName;
}
public void setDictName(String dictName) {
this.dictName = dictName;
}
}
2:模拟从服务器获取的字典值
/**
*
* dict_code:字典值
* dict_name:字典名称
* tp_code:字典编码
* cancel_status:启用状态(-1作废,0启用)
*
*/
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("dict_code", "1");
map1.put("dict_name", "北京");
map1.put("tp_code", "site");
map1.put("cancel_status", "0");
list.add(map1);
Map<String, String> map2 = new HashMap<>();
map2.put("dict_code", "2");
map2.put("dict_name", "上海");
map2.put("tp_code", "site");
map2.put("cancel_status", "0");
list.add(map2);
Map<String, String> map3 = new HashMap<>();
map3.put("dict_code", "3");
map3.put("dict_name", "南京");
map3.put("tp_code", "site");
map3.put("cancel_status", "-1");
list.add(map3);
Map<String, String> map4 = new HashMap<>();
map4.put("dict_code", "4");
map4.put("dict_name", "武汉");
map4.put("tp_code", "site");
map4.put("cancel_status", "0");
list.add(map4);
Map<String, String> map5 = new HashMap<>();
map5.put("dict_code", "5");
map5.put("dict_name", "深圳");
map5.put("tp_code", "site");
map5.put("cancel_status", "-1");
list.add(map5);
Map<String, String> map6 = new HashMap<>();
map6.put("dict_code", "0");
map6.put("dict_name", "是");
map6.put("tp_code", "yesOrNo");
map6.put("cancel_status", "0");
list.add(map6);
Map<String, String> map7 = new HashMap<>();
map7.put("dict_code", "1");
map7.put("dict_name", "否");
map7.put("tp_code", "yesOrNo");
map7.put("cancel_status", "0");
list.add(map7);
Map<String, String> map8 = new HashMap<>();
map8.put("dict_code", "1");
map8.put("dict_name", "晴天");
map8.put("tp_code", "weather");
map8.put("cancel_status", "0");
list.add(map8);
Map<String, String> map9 = new HashMap<>();
map9.put("dict_code", "4");
map9.put("dict_name", "阴天");
map9.put("tp_code", "weather");
map9.put("cancel_status", "0");
list.add(map9);
Map<String, String> map10 = new HashMap<>();
map10.put("dict_code", "5");
map10.put("dict_name", "雨天");
map10.put("tp_code", "weather");
map10.put("cancel_status", "0");
list.add(map10);
Log.e("从服务器获取的字典", list.toString());
for (int i = 0; i < list.size(); i++) {
Log.e("从服务器获取的字典", list.get(i).toString());
}
结果
E/从服务器获取的字典: [{dict_name=北京, cancel_status=0, tp_code=site, dict_code=1}, {dict_name=上海, cancel_status=0, tp_code=site, dict_code=2}, {dict_name=南京, cancel_status=-1, tp_code=site, dict_code=3}, {dict_name=武汉, cancel_status=0, tp_code=site, dict_code=4}, {dict_name=深圳, cancel_status=-1, tp_code=site, dict_code=5}, {dict_name=是, cancel_status=0, tp_code=yesOrNo, dict_code=0}, {dict_name=否, cancel_status=0, tp_code=yesOrNo, dict_code=1}, {dict_name=晴天, cancel_status=0, tp_code=weather, dict_code=1}, {dict_name=阴天, cancel_status=0, tp_code=weather, dict_code=4}, {dict_name=雨天, cancel_status=0, tp_code=weather, dict_code=5}]
E/从服务器获取的字典: {dict_name=北京, cancel_status=0, tp_code=site, dict_code=1}
E/从服务器获取的字典: {dict_name=上海, cancel_status=0, tp_code=site, dict_code=2}
E/从服务器获取的字典: {dict_name=南京, cancel_status=-1, tp_code=site, dict_code=3}
E/从服务器获取的字典: {dict_name=武汉, cancel_status=0, tp_code=site, dict_code=4}
E/从服务器获取的字典: {dict_name=深圳, cancel_status=-1, tp_code=site, dict_code=5}
E/从服务器获取的字典: {dict_name=是, cancel_status=0, tp_code=yesOrNo, dict_code=0}
E/从服务器获取的字典: {dict_name=否, cancel_status=0, tp_code=yesOrNo, dict_code=1}
E/从服务器获取的字典: {dict_name=晴天, cancel_status=0, tp_code=weather, dict_code=1}
E/从服务器获取的字典: {dict_name=阴天, cancel_status=0, tp_code=weather, dict_code=4}
E/从服务器获取的字典: {dict_name=雨天, cancel_status=0, tp_code=weather, dict_code=5}
3:将从服务器获取到的字典值保存下来
//将从服务器获取到的字典全部保存下来
Map<String, List<Dict>> maps = new HashMap<>();
for (Map<String, String> m : list) {
List<Dict> lists = new ArrayList<>();
Dict dict = new Dict();
dict.setDictCode(m.get("dict_code"));
dict.setDictName(m.get("dict_name"));
if (maps.containsKey(m.get("tp_code"))) {
lists = maps.get(m.get("tp_code"));
lists.add(dict);
} else {
lists.add(dict);
}
maps.put(m.get("tp_code"), lists);
}
Map mapDict1 = setMapDict(maps);
Log.e("获取的全部字典", mapDict1.toString());
// 保存启用状态的字典值
Map<String, List<Dict>> map_enable = new HashMap<>();
for (Map<String, String> m : list) {
List<Dict> lists = new ArrayList<>();
Dict dict = new Dict();
if (m.get("cancel_status").equals("0")) {
dict.setDictCode(m.get("dict_code"));
dict.setDictName(m.get("dict_name"));
if (map_enable.containsKey(m.get("tp_code"))) {
lists = map_enable.get(m.get("tp_code"));
lists.add(dict);
} else {
lists.add(dict);
}
map_enable.put(m.get("tp_code"), lists);
}
}
Map mapDict2 = setMapDict(map_enable);
Log.e("获取的启用字典", mapDict2.toString());
创建setMapDict()方法将字典转为Map<String, Map<String, String>>类型存储
/**
* @param maps 从服务器获取到的保存字典的map集合
* @methord 将字典转为Map<String, Map<String, String>>类型存储
*/
private Map<String, Map<String, String>> setMapDict(Map<String, List<Dict>> maps) {
Map dict = new HashMap();
for (Map.Entry<String, List<Dict>> entry: maps.entrySet()
) {
List<Dict> d = entry.getValue();
Map map = new HashMap();
for (int i = 0; i < d.size(); i++) {
map.put(d.get(i).getDictCode(), d.get(i).getDictName());
}
dict.put(entry.getKey(), map);
}
return dict;
}
结果
E/获取的全部字典: {site={1=北京, 2=上海, 3=南京, 4=武汉, 5=深圳}, weather={1=晴天, 4=阴天, 5=雨天}, yesOrNo={0=是, 1=否}}
E/获取的启用字典: {site={1=北京, 2=上海, 4=武汉}, weather={1=晴天, 4=阴天, 5=雨天}, yesOrNo={0=是, 1=否}}
二:调用保存下来的字典值展示在界面上
1:activity_main.xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Spinner
android:id="@+id/site_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Spinner
android:id="@+id/yesOrNo_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Spinner
android:id="@+id/weather_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
2:创建自定义适配器SpinnerArrayAdapter
package com.example.test;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class SpinnerArrayAdapter extends BaseAdapter {
private Context context;
private List<Dict> list;
public SpinnerArrayAdapter(Context context, List<Dict> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Text text = null;
if (convertView == null) {
text = new Text();
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.list_spinner, null);
text.text_code = convertView.findViewById(R.id.text_code);
text.text_name = convertView.findViewById(R.id.text_name);
convertView.setTag(text);
} else {
text = (Text) convertView.getTag();
}
text.text_code.setText(list.get(position).getDictCode());
text.text_name.setText(list.get(position).getDictName());
return convertView;
}
class Text{
TextView text_code;
TextView text_name;
}
}
3:自定义下拉框的布局list_spinner
<?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">
<TextView
android:id="@+id/text_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/text_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"/>
</LinearLayout>
4:MainActivity调用
Spinner site_spinner = findViewById(R.id.site_spinner);
Spinner yesOrNo_spinner = findViewById(R.id.yesOrNo_spinner);
Spinner weather_spinner = findViewById(R.id.weather_spinner);
SpinnerArrayAdapter adapter1 = new SpinnerArrayAdapter(this, map_enable.get("site"));
site_spinner.setAdapter(adapter1);
SpinnerArrayAdapter adapter2 = new SpinnerArrayAdapter(this, map_enable.get("yesOrNo"));
yesOrNo_spinner.setAdapter(adapter2);
SpinnerArrayAdapter adapter3 = new SpinnerArrayAdapter(this, map_enable.get("weather"));
weather_spinner.setAdapter(adapter3);
运行结果
三:获取选择的下拉框项及其对应的字典值
Button btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String dict_code1 = ((Dict)site_spinner.getSelectedItem()).getDictCode();
String dict_name1 = ((Dict)site_spinner.getSelectedItem()).getDictName();
String dict_code2 = ((Dict)yesOrNo_spinner.getSelectedItem()).getDictCode();
String dict_name2 = ((Dict)yesOrNo_spinner.getSelectedItem()).getDictName();
String dict_code3 = ((Dict)weather_spinner.getSelectedItem()).getDictCode();
String dict_name3 = ((Dict)weather_spinner.getSelectedItem()).getDictName();
Toast.makeText(MainActivity.this, "您选择的是" + dict_code1 + dict_name1 + "," + dict_code2 + dict_name2 + "," + dict_code3 + dict_name3, Toast.LENGTH_LONG).show();
}
});
结果
用这种方法获取到的字典值作为下拉框数据源时与下拉框的下标值无关,从服务器获取到的字典值是多少提交的时候获取到的就是多少