Android spinner实现全国省市县的三级联动
这种写法虽好,但存在一些小bug,下面是我修复的思路
问题一:三级联动的每一项值如何获取到?
String s = spinner1.getSelectedItem().toString();
if (!(spinner1.getSelectedItem().toString().equals(spinner2.getSelectedItem().toString()))){
s+=" "+spinner2.getSelectedItem().toString();
}
if (!(spinner2.getSelectedItem().toString().equals(spinner3.getSelectedItem().toString()))){
s+=" "+spinner3.getSelectedItem().toString();
}
tvAddress.setText(s);
问:为什么我要加判断再拼接?
答:因为每一项的三级联动的spinner1~3,会有一些相同的值,如果不判断那最终得到的结果可能会是“重庆 重庆 重庆”,如果加了判断得到的值就是“重庆”。
问题二:选择完地址后,下次点击时为什么spinner1和spinner2~3的值就不关联了(也就是没有被记住上一次选择的值),这会导致点开来我们看到“北京 上海 海口”
private int provinceIndex=-100,districtIndex=-100,cityIndex=-100;
if (provinceIndex!=-100){
spinner1.setSelection(provinceIndex, true);
}else{
spinner1.setSelection(0, true);
}
if (districtIndex!=-100){
spinner2.setSelection(districtIndex, true);
}else{
spinner2.setSelection(0, true);
}
if (cityIndex!=-100){
spinner3.setSelection(cityIndex, true);
}else{
spinner3.setSelection(0, true);
}
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
provinceIndex = position;
Log.d("wangrui","provinceIndex="+provinceIndex);
province = list.get(position);
arrayAdapter2 = new ArrayAdapter<City>(MainActivity.this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, list.get(position).getCitys());
spinner2.setAdapter(arrayAdapter2);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
pinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
districtIndex = position;
Log.d("wangrui","districtIndex="+districtIndex);
arrayAdapter3 = new ArrayAdapter<District>(MainActivity.this,androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,province.getCitys().get(position).getDistricts());
spinner3.setAdapter(arrayAdapter3);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinner3.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
cityIndex = i;
Log.d("wangrui","cityIndex="+cityIndex);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
分析:原理就是在每一个监听事件里记住每一项的下标,设值的时候判断如果没记过下标默认选0,记过下次就默认显示上次选择的值