android NumberPicker实现三级省市区的选择

ad_789 2015-07-09 12:57:34
public class NumberAdressPicker extends BaseActivity {
private @FindViewById(id = R.id.comeback)
View comebackBtn;
private @FindViewById(id = R.id.finishTv)
TextView finishTv;
private @FindViewById(id = R.id.address)
TextView address;
private @FindViewById(id = R.id.address_re)
RelativeLayout address_re;
private @FindViewById(id = R.id.butom)
LinearLayout butomLay;
private @FindViewById(id = R.id.numberPickerPro)
NumberPicker np;// 省
private @FindViewById(id = R.id.numberPickerShi)
NumberPicker shiNp;// 市
private @FindViewById(id = R.id.numberPickerQu)
NumberPicker quNp;// 区
private PkBo pkbo;
private Map<String, List<Map<String, List<String>>>> map;
private String nowVal;
private int shi;
private int province;
private int qu;
private Set<String> shiset = null;
private List<Map<String, List<String>>> shilist;
private String[] st;
private int shilength;
private int qulength;
private String[] shiarr = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_numberpicker);
pkbo = new PkBo();
map = new HashMap<String, List<Map<String, List<String>>>>();
shiset = new HashSet<String>();
shilist = new ArrayList<Map<String, List<String>>>();
pkbo.getProvince(new ResultCallBack() {

@Override
public void onSuccess(Result result) {
if (result.isSuccess()) {
map = JsonUtil.getList(result.getData());
Set<String> pro = map.keySet();
st = new String[pro.size()];
int i = 0;
for (String s : pro) {
st[i++] = s;
}
PrintUtil.log("==省", "====" + st);
np.setMaxValue(st.length - 1);
np.setMinValue(0);
np.setDisplayedValues(st);
np.setFocusable(true);
np.setFocusableInTouchMode(true);

// 所有的市集合
shilist = map.get(st[0]);
PrintUtil.log("===市区", "====" + shilist);
//String[] shiarr = null;

for (Map<String, List<String>> map : shilist) {
shiset = map.keySet();
shiarr = new String[shiset.size()];
int d = 0;
for (String s : shiset) {
shiarr[d] = s;
d = d + 1;
PrintUtil.log("====", "===" + s);
}
}
for (String s : shiarr) {
PrintUtil.log("====市的数组=", "======" + s);
}
shilength=shiarr.length - 1;
//shiNp.setMaxValue(shiarr.length - 1);
shiNp.setMinValue(0);
shiNp.setDisplayedValues(shiarr);
shiNp.setFocusable(true);
shiNp.setFocusableInTouchMode(true);

// 一个市的所有区
Map<String, List<String>> map = shilist.get(0);
PrintUtil.log("===区", "====" + map);

Set<String> quset = map.keySet();
String[] sts = new String[quset.size()];
int z = 0;
for (String s : quset) {
sts[z++] = s;
}
quNp.setMaxValue(sts.length - 1);
quNp.setMinValue(0);
quNp.setDisplayedValues(sts);
quNp.setFocusable(true);
quNp.setFocusableInTouchMode(true);

}
}
});
// 分离数据
np.setOnFocusChangeListener(new OnFocusChangeListener() {

@Override
public void onFocusChange(View arg0, boolean arg1) {

}
});

np.setOnValueChangedListener(new OnValueChangeListener() {

@Override
public void onValueChange(NumberPicker arg0, int oldVal, int newVal) {
province = newVal;
PrintUtil.log("=====","======"+oldVal);
PrintUtil.log("=====","======"+newVal);

// 所有的市集合
shilength=map.get(st[oldVal]).size();
shilist = map.get(st[newVal]);
PrintUtil.log("===st[newVal]", "====" + st[newVal]);
PrintUtil.log("===市区", "====" + shilist);

for (Map<String, List<String>> map : shilist) {
shiset = map.keySet();
shiarr = new String[shiset.size()];
int d = 0;
for (String s : shiset) {
shiarr[d] = s;
d = d + 1;
PrintUtil.log("====", "===" + s);
}
}
for (String s : shiarr) {
PrintUtil.log("====市的数组=", "======" + s);
}

shiNp=(NumberPicker) findViewById(R.id.numberPickerShi);
PrintUtil.log("====控件长度=", "======" + shiNp.getMaxValue());
PrintUtil.log("====数组长度=", "======" + shiarr.length);
shiNp.setMaxValue(shiarr.length-1);
PrintUtil.log("====控件长度=", "======" + shiNp.getMaxValue());
shiNp.setMinValue(0);
shiNp.setDisplayedValues(shiarr);
shiNp.setFocusable(true);
shiNp.setFocusableInTouchMode(true);
}
});

shiNp.setOnValueChangedListener(new OnValueChangeListener() {

@Override
public void onValueChange(NumberPicker arg0, int oldVal, int newVal) {
shi = newVal;
}
});

quNp.setOnValueChangedListener(new OnValueChangeListener() {

@Override
public void onValueChange(NumberPicker arg0, int oldVal, int newVal) {

qu = newVal;
}
});
finishTv.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
nowVal = province + "," + shi + "," + qu;
address.setText(nowVal);
butomLay.setVisibility(View.GONE);
LApplication.put("ADDRESS", nowVal);
}
});
address_re.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
butomLay.setVisibility(View.VISIBLE);
}
});
comebackBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
finish();
}
});
}
}

//==========选择最左边的numberPicker选中最左边的省份选择器。选择下一个省份,监听市的选择,自动添加市,我是这监听认为的,可是。一直有数组越界的错误,好像省份的numberPicker那个MaxValue还是之前的。没有改变并且就是这句话报错。shiNp.setMaxValue(shiarr.length-1);
07-09 04:38:12.889: D/===市区(15262): ====[{41630,南平市=[42550,延平区, 42551,邵武市, 42552,武夷山市, 42553,建瓯市, 42554,建阳市, 42555,顺昌县, 42556,浦城县, 42557,光泽县, 42558,松溪县, 42559,政和县], 41629,漳州市=[42403,芗城区, 42404,龙文区, 42405,龙海市, 42406,云霄县, 42407,漳浦县, 42408,诏安县, 42409,长泰县, 42410,东山县, 42411,南靖县, 42412,平和县, 42413,平和县, 42414,华安县], 41626,莆田市=[42084,城厢区, 42085,涵江区, 42086,荔城区, 42087,秀屿区, 42088,仙游县], 41625,厦门市=[42039,思明区, 42040,海沧区, 42041,湖里区, 42042,集美区, 42043,同安区, 42044,翔安区], 41624,福州市=[41646,鼓楼区, 41647,台江区, 41648,仓山区, 41649,马尾区, 41650,晋安区, 41651,福清市, 41652,长乐市, 41653,闽侯县, 41654,连江县, 41655,罗源县, 41656,闽清县, 41657,永泰县, 41658,平潭县], 13222,宣城市=[14736,宣州区, 14737,宁国市, 14738,郎溪县, 14739,广德县, 14740,泾 县, 14741,绩溪县, 14742,旌德县], 41631,龙岩市=[42690,新罗区, 42691,漳平市, 42692,长汀县, 42693,永定县, 42694,上杭县, 42695,武平县, 42696,连城县], 41627,三明市=[42143,梅列区, 42144,三元区, 42145,永安市, 42146,明溪县, 42147,清流县, 42148,宁化县, 42149,大田县, 42150,尤溪县, 42151,沙 县, 42152,将乐县, 42153,泰宁县, 42154,建宁县], 41628,泉州市=[42288,鲤城区, 42289,丰泽区, 42290,洛江区, 42291,泉港区, 42292,石狮市, 42293,晋江市, 42294,南安市, 42295,惠安县, 42296,安溪县, 42297,永春县, 42298,德化县, 42299,金门县]}]

07-09 04:38:12.889: D/====(15262): ===41630,南平市
07-09 04:38:12.889: D/====(15262): ===41629,漳州市
07-09 04:38:12.889: D/====(15262): ===41626,莆田市
07-09 04:38:12.889: D/====(15262): ===41625,厦门市
07-09 04:38:12.889: D/====(15262): ===41624,福州市
07-09 04:38:12.889: D/====(15262): ===13222,宣城市
07-09 04:38:12.889: D/====(15262): ===41631,龙岩市
07-09 04:38:12.889: D/====(15262): ===41627,三明市
07-09 04:38:12.889: D/====(15262): ===41628,泉州市
07-09 04:38:12.889: D/====市的数组=(15262): ======41630,南平市
07-09 04:38:12.889: D/====市的数组=(15262): ======41629,漳州市
07-09 04:38:12.889: D/====市的数组=(15262): ======41626,莆田市
07-09 04:38:12.889: D/====市的数组=(15262): ======41625,厦门市
07-09 04:38:12.889: D/====市的数组=(15262): ======41624,福州市
07-09 04:38:12.889: D/====市的数组=(15262): ======13222,宣城市
07-09 04:38:12.889: D/====市的数组=(15262): ======41631,龙岩市
07-09 04:38:12.889: D/====市的数组=(15262): ======41627,三明市
07-09 04:38:12.889: D/====市的数组=(15262): ======41628,泉州市
07-09 04:38:12.889: D/====控件长度=(15262): ======2
07-09 04:38:12.893: D/====数组长度=(15262): ======9


07-09 04:38:12.909: E/AndroidRuntime(15262): FATAL EXCEPTION: main
07-09 04:38:12.909: E/AndroidRuntime(15262): java.lang.ArrayIndexOutOfBoundsException: length=3; index=8
07-09 04:38:12.909: E/AndroidRuntime(15262): at android.widget.NumberPicker.ensureCachedScrollSelectorValue(NumberPicker.java:1696)
07-09 04:38:12.909: E/AndroidRuntime(15262): at android.widget.NumberPicker.initializeSelectorWheelIndices(NumberPicker.java:1511)
07-09 04:38:12.909: E/AndroidRuntime(15262): at android.widget.NumberPicker.setMaxValue(NumberPicker.java:1310)
07-09 04:38:12.909: E/AndroidRuntime(15262): at com.example.xuechao.controller.hall.NumberAdressPicker$3.onValueChange(NumberAdressPicker.java:178)
07-09 04:38:12.909: E/AndroidRuntime(15262): at android.widget.NumberPicker.notifyChange(NumberPicker.java:1750)
07-09 04:38:12.909: E/AndroidRuntime(15262): at android.widget.NumberPicker.setValueInternal(NumberPicker.java:1536)
07-09 04:38:12.909: E/AndroidRuntime(15262): at android.widget.NumberPicker.scrollBy(NumberPicker.java:1039)
07-09 04:38:12.909: E/AndroidRuntime(15262): at android.widget.NumberPicker.computeScroll(NumberPicker.java:993)
//选中最左边的省份选择器。选择下一个省份,监听市的选择,自动添加市,我是这样监听认为的,可是。一直有数组越界的错误,好像省份的numberPicker那个MaxValue还是之前的。没有改变并且就是这句话报错。shiNp.setMaxValue(shiarr.length-1);
在第一个监听器里面=========np的监听


...全文
1256 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_31198807 2016-05-04
  • 打赏
  • 举报
回复
引用 2 楼 qq_31198807 的回复:
http://download.csdn.net/detail/qq_31198807/9510029
本人至今在用的三级联动菜单。。
qq_31198807 2016-05-04
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/qq_31198807/9510029
ad_789 2015-07-09
  • 打赏
  • 举报
回复
里面有一个空的监听,我已经删除啦

80,356

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧