使用Android-PickerView选择器实现三级选择器
实现效果
-
导入依赖
api 'com.contrarywind:Android-PickerView:4.1.6'
-
导入最新地址数据Json文件到与assets目录(若没有assets则新建,目录与res同级)
-
创建实体类(用来Json2Bean)
import com.contrarywind.interfaces.IPickerViewData //存放省以及所属市 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 }
-
编写获取json文件内容工具类
import android.content.Context import android.content.res.AssetManager import java.io.* object FileUtil{ fun getAssetsFileText(context: Context,fileName:String):String{ val strBuilder=StringBuilder() val assetManager=context.assets val bf = BufferedReader(InputStreamReader(assetManager.open(fileName))) bf.use { var line: String? while (it.readLine().also {newLine-> line = newLine } !=null){ strBuilder.append(line) } } bf.close() return strBuilder.toString() } }
-
显示PickerView
/** * 显示地址选择 */ override 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] }) .setTitleText(pickerEnum.title) .setDividerColor(Color.BLACK) .setTextColorCenter(Color.BLACK) //设置选中项文字颜色 .setContentTextSize(20) .build<AddressInfoPO>() addressPv.setPicker(provinceItems, cityItems, areaItems) addressPv.show() }
-
初始化三级联动所需数据
/** * 初始化地址数据 */ 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(mApplication, "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) } //显示选择器 mRootView.showAddressPicker(provinceItems,cityItems,areaItems) }