效果图
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)
}
}