用ViewPager2做一个地址选择器

500 阅读1分钟

android 四级联动地址选择器

之前遇到一个需求,需要一个四级联动的地址选择器,Github上找了许久,要么是年代过于久远不维护,要么是只有三级联动没有满意的,遂自己动手实现,于是有了本项目android 四级联动地址选择器


技术

本人喜欢新东西,故本项目都是采用的较新的框架和技术,对于安卓5.0之前的兼容性未经过测试。

  • 项目源码是kotlin编写
  • 数据库是Jetpack的Room
  • LiveData
  • ViewPager2

数据源

国内的地址数据来源于Github上开源项目Administrative-divisions-of-China,该项目所爬数据的最终来源是国家统计局等政府权威部门,目前最新的数据是2019年(2020年2月发布)

预览

QQ20201107-185553-HD

思路

  • Room数据库加载国内的地址数据db文件
 private fun buildDatabase(context: Context): AppDatabase =
            Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
                .createFromAsset("databases/$DATABASE_NAME.db")
                .build()

  • 利用LiveData作为Room查询数据的返回值,便于监听
 @Query("SELECT * FROM city where provinceCode = :provinceCode")
    fun getCityList(provinceCode: String): LiveData<List<City>>
  • TabLayout+ViewPager2,RecyclerView,SiderBar
  • 数据的展示则由TabLayout和ViewPager2联动,通过TabLayoutMediator动态加载变更ViewPager2中的item
 adapterStreet.clickListener = ClickCallback {
            mediator.detach()//先解绑vp2和tab
            currentStreet = adapterStreet.getDataList()[it.tag as Int]
            onLastSelected()
            mediator.attach()//重新绑定
        }
  • 自定义一个滚动条,通过传入RecyclerView的layoutManager进行滚动联动

总结

具体实现,有兴趣可以去本项目的Github上看