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

使用Android-PickerView选择器实现三级选择器

实现效果

地址三级联动

  1. 导入依赖

    api 'com.contrarywind:Android-PickerView:4.1.6'
    
  2. 导入最新地址数据Json文件到与assets目录(若没有assets则新建,目录与res同级)

  3. 创建实体类(用来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
    }
    
  4. 编写获取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()
    }
    }
    
    
  5. 显示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()
    }
    
  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(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)
    }
    
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值