Kotlin-使用PickerView实现三级联动选择器

效果图

1.导入依赖

implementation 'com.contrarywind:Android-PickerView:4.1.6'
implementation 'com.google.code.gson:gson:2.8.5'

2.导入Json文件到与assets目录(若没有assets则新建,目录与res同级)

文件地址:https://github.com/modood/Administrative-divisions-of-China

3.创建实体类

//存放省以及所属市
data class PCACodePO(
        val code: String,
        val name: String,
        val children: MutableList<CCodePO>
)

//存放市以及所属辖区
data class CCodePO(
        val code: String,
        val name: String,
        val children: MutableList<AddressInfoPO>
)

//用于显示PickerView显示
data class AddressInfoPO(
        //地区编码
        val code: String,
        //地区名称
        val name: String
) : IPickerViewData {
    override fun getPickerViewText(): String = name
}

4.编写获取json文件内容工具类

object FileUtil{
   // 获取json文件内容
    fun getAssetsFileText(context: Context,fileName:String):String{
        val strBuilder=StringBuilder()
        val assetManager=context.assets
        val bf =BufferedReader(InputStreamReader(assetManager.open(fileName)))
        bf.use { strBuilder.append(it.readLine())}
        bf.close()
        return strBuilder.toString()
    }
}

5.显示PickerView

/**
 * 显示地址选择
 */
fun showAddressPicker(provinceItems: MutableList<AddressInfoPO>,
                               cityItems: MutableList<MutableList<AddressInfoPO>>,
                               areaItems: MutableList<MutableList<MutableList<AddressInfoPO>>>) {
    val addressPv =
            OptionsPickerBuilder(this, OnOptionsSelectListener { options1, options2, options3, v ->
                //省份
                provinceItems[options1]
                //城市
                cityItems[options1][options2]
                //辖区
                areaItems[options1][options2][options3]
                //获得选择的数据
    var  tx:String= provinceItems.get(options1).pickerViewText+cityItems.get(options1).get(options2).pickerViewText+areaItems.get(options1).get(options2).get(options3).pickerViewText
                msel_tv.setText(tx)
            })
                   // .setTitleText(pickerEnum.title)
                    .setDividerColor(Color.BLACK)
                    .setTextColorCenter(Color.BLACK) //设置选中项文字颜色
                    .setContentTextSize(20)
                    .build<AddressInfoPO>()
    addressPv.setPicker(provinceItems, cityItems, areaItems)
    addressPv.show()
}

6.初始化三级联动所需数据

/**
 * 初始化地址数据
 */
fun initAddressPicker() {
    val provinceItems = mutableListOf<AddressInfoPO>()
    val cityItems = mutableListOf<MutableList<AddressInfoPO>>()
    val areaItems = mutableListOf<MutableList<MutableList<AddressInfoPO>>>()
    //Json2Bean
    val pcaCodeList = Gson().fromJson<MutableList<PCACodePO>>(FileUtil
            .getAssetsFileText(this, "pcacode.json"),
            object : TypeToken<MutableList<PCACodePO>>() {}.type)
    //遍历省
    pcaCodeList.forEach {pcaCode ->
        //存放省内市区
        val cityList= mutableListOf<AddressInfoPO>()
        //存放省内所有辖区
        val areaList= mutableListOf<MutableList<AddressInfoPO>>()
        //遍历省内市区
        pcaCode.children.forEach { cCode ->
            //添加省内市区
            cityList.add(AddressInfoPO(cCode.code,cCode.name))
            //存放市内辖区
            val areas= mutableListOf<AddressInfoPO>()
            //添加市内辖区
            cCode.children.forEach {addressInfo->
                areas.add(addressInfo)
            }
            areaList.add(areas)
        }
        //添加省份
        provinceItems.add(AddressInfoPO(pcaCode.code,pcaCode.name))
        //添加市区
        cityItems.add(cityList)
        //添加辖区
        areaItems.add(areaList)
    }
    //显示选择器
    msel_btn.setOnClickListener{
        showAddressPicker(provinceItems,cityItems,areaItems)
    }
}

原文地址:https://blog.csdn.net/zylvip/article/details/84147771

猜你喜欢

转载自blog.csdn.net/qq_17798399/article/details/86086667