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,记过下次就默认显示上次选择的值

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐