diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 72b7238..8569dc1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -9,6 +9,8 @@ import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.model.InspectEventModel import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.single.fragment.QueryEventFragment +import com.casic.birmm.inspect.single.fragment.QueryInspectionFragment class DataBaseManager private constructor() { @@ -56,6 +58,8 @@ if (!isInspectionExist(inspectionId)) { inspectionDao.insert(bean) + //通知列表刷新 + QueryInspectionFragment.weakReferenceHandler.sendEmptyMessage(2023081202) } } @@ -204,6 +208,8 @@ bean.user = "超级管理员" if (!isEventExist(taskId)) { taskEventDao.insert(bean) + //通知列表刷新 + QueryEventFragment.weakReferenceHandler.sendEmptyMessage(2023081102) } } diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 72b7238..8569dc1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -9,6 +9,8 @@ import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.model.InspectEventModel import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.single.fragment.QueryEventFragment +import com.casic.birmm.inspect.single.fragment.QueryInspectionFragment class DataBaseManager private constructor() { @@ -56,6 +58,8 @@ if (!isInspectionExist(inspectionId)) { inspectionDao.insert(bean) + //通知列表刷新 + QueryInspectionFragment.weakReferenceHandler.sendEmptyMessage(2023081202) } } @@ -204,6 +208,8 @@ bean.user = "超级管理员" if (!isEventExist(taskId)) { taskEventDao.insert(bean) + //通知列表刷新 + QueryEventFragment.weakReferenceHandler.sendEmptyMessage(2023081102) } } diff --git a/app/src/main/res/drawable/ic_dot_blue.xml b/app/src/main/res/drawable/ic_dot_blue.xml new file mode 100644 index 0000000..5e709c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_blue.xml @@ -0,0 +1,12 @@ + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 72b7238..8569dc1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -9,6 +9,8 @@ import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.model.InspectEventModel import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.single.fragment.QueryEventFragment +import com.casic.birmm.inspect.single.fragment.QueryInspectionFragment class DataBaseManager private constructor() { @@ -56,6 +58,8 @@ if (!isInspectionExist(inspectionId)) { inspectionDao.insert(bean) + //通知列表刷新 + QueryInspectionFragment.weakReferenceHandler.sendEmptyMessage(2023081202) } } @@ -204,6 +208,8 @@ bean.user = "超级管理员" if (!isEventExist(taskId)) { taskEventDao.insert(bean) + //通知列表刷新 + QueryEventFragment.weakReferenceHandler.sendEmptyMessage(2023081102) } } diff --git a/app/src/main/res/drawable/ic_dot_blue.xml b/app/src/main/res/drawable/ic_dot_blue.xml new file mode 100644 index 0000000..5e709c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_blue.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_dot_green.xml b/app/src/main/res/drawable/ic_dot_green.xml new file mode 100644 index 0000000..f2638aa --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_green.xml @@ -0,0 +1,12 @@ + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 72b7238..8569dc1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -9,6 +9,8 @@ import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.model.InspectEventModel import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.single.fragment.QueryEventFragment +import com.casic.birmm.inspect.single.fragment.QueryInspectionFragment class DataBaseManager private constructor() { @@ -56,6 +58,8 @@ if (!isInspectionExist(inspectionId)) { inspectionDao.insert(bean) + //通知列表刷新 + QueryInspectionFragment.weakReferenceHandler.sendEmptyMessage(2023081202) } } @@ -204,6 +208,8 @@ bean.user = "超级管理员" if (!isEventExist(taskId)) { taskEventDao.insert(bean) + //通知列表刷新 + QueryEventFragment.weakReferenceHandler.sendEmptyMessage(2023081102) } } diff --git a/app/src/main/res/drawable/ic_dot_blue.xml b/app/src/main/res/drawable/ic_dot_blue.xml new file mode 100644 index 0000000..5e709c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_blue.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_dot_green.xml b/app/src/main/res/drawable/ic_dot_green.xml new file mode 100644 index 0000000..f2638aa --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_green.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/item_event_rv_l.xml b/app/src/main/res/layout/item_event_rv_l.xml index e7d44d7..9e24bfd 100644 --- a/app/src/main/res/layout/item_event_rv_l.xml +++ b/app/src/main/res/layout/item_event_rv_l.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_5" - android:layout_marginBottom="@dimen/dp_5" + android:layout_marginTop="@dimen/dp_5" android:background="@drawable/bg_solid_layout_white_radius_5" android:orientation="horizontal" android:padding="@dimen/dp_5"> diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 72b7238..8569dc1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -9,6 +9,8 @@ import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.model.InspectEventModel import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.single.fragment.QueryEventFragment +import com.casic.birmm.inspect.single.fragment.QueryInspectionFragment class DataBaseManager private constructor() { @@ -56,6 +58,8 @@ if (!isInspectionExist(inspectionId)) { inspectionDao.insert(bean) + //通知列表刷新 + QueryInspectionFragment.weakReferenceHandler.sendEmptyMessage(2023081202) } } @@ -204,6 +208,8 @@ bean.user = "超级管理员" if (!isEventExist(taskId)) { taskEventDao.insert(bean) + //通知列表刷新 + QueryEventFragment.weakReferenceHandler.sendEmptyMessage(2023081102) } } diff --git a/app/src/main/res/drawable/ic_dot_blue.xml b/app/src/main/res/drawable/ic_dot_blue.xml new file mode 100644 index 0000000..5e709c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_blue.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_dot_green.xml b/app/src/main/res/drawable/ic_dot_green.xml new file mode 100644 index 0000000..f2638aa --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_green.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/item_event_rv_l.xml b/app/src/main/res/layout/item_event_rv_l.xml index e7d44d7..9e24bfd 100644 --- a/app/src/main/res/layout/item_event_rv_l.xml +++ b/app/src/main/res/layout/item_event_rv_l.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_5" - android:layout_marginBottom="@dimen/dp_5" + android:layout_marginTop="@dimen/dp_5" android:background="@drawable/bg_solid_layout_white_radius_5" android:orientation="horizontal" android:padding="@dimen/dp_5"> diff --git a/app/src/main/res/layout/item_inspect_rv_l.xml b/app/src/main/res/layout/item_inspect_rv_l.xml index f2b0626..11f13e6 100644 --- a/app/src/main/res/layout/item_inspect_rv_l.xml +++ b/app/src/main/res/layout/item_inspect_rv_l.xml @@ -1,59 +1,172 @@ + + + android:orientation="horizontal"> - + - + - + + - + + + + + + + + + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 72b7238..8569dc1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -9,6 +9,8 @@ import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.model.InspectEventModel import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.single.fragment.QueryEventFragment +import com.casic.birmm.inspect.single.fragment.QueryInspectionFragment class DataBaseManager private constructor() { @@ -56,6 +58,8 @@ if (!isInspectionExist(inspectionId)) { inspectionDao.insert(bean) + //通知列表刷新 + QueryInspectionFragment.weakReferenceHandler.sendEmptyMessage(2023081202) } } @@ -204,6 +208,8 @@ bean.user = "超级管理员" if (!isEventExist(taskId)) { taskEventDao.insert(bean) + //通知列表刷新 + QueryEventFragment.weakReferenceHandler.sendEmptyMessage(2023081102) } } diff --git a/app/src/main/res/drawable/ic_dot_blue.xml b/app/src/main/res/drawable/ic_dot_blue.xml new file mode 100644 index 0000000..5e709c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_blue.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_dot_green.xml b/app/src/main/res/drawable/ic_dot_green.xml new file mode 100644 index 0000000..f2638aa --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_green.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/item_event_rv_l.xml b/app/src/main/res/layout/item_event_rv_l.xml index e7d44d7..9e24bfd 100644 --- a/app/src/main/res/layout/item_event_rv_l.xml +++ b/app/src/main/res/layout/item_event_rv_l.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_5" - android:layout_marginBottom="@dimen/dp_5" + android:layout_marginTop="@dimen/dp_5" android:background="@drawable/bg_solid_layout_white_radius_5" android:orientation="horizontal" android:padding="@dimen/dp_5"> diff --git a/app/src/main/res/layout/item_inspect_rv_l.xml b/app/src/main/res/layout/item_inspect_rv_l.xml index f2b0626..11f13e6 100644 --- a/app/src/main/res/layout/item_inspect_rv_l.xml +++ b/app/src/main/res/layout/item_inspect_rv_l.xml @@ -1,59 +1,172 @@ + + + android:orientation="horizontal"> - + - + - + + - + + + + + + + + + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/single_fragment_query_event.xml b/app/src/main/res/layout/single_fragment_query_event.xml index 47ef620..f2d7b92 100644 --- a/app/src/main/res/layout/single_fragment_query_event.xml +++ b/app/src/main/res/layout/single_fragment_query_event.xml @@ -4,7 +4,7 @@ android:id="@+id/rootView" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/white" + android:background="@color/mainBackground" android:orientation="vertical"> diff --git a/.idea/misc.xml b/.idea/misc.xml index e7cbf98..60406bc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -20,6 +20,9 @@ + + + @@ -70,7 +73,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3127c49..067a62a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.10.1' //Kotlin协程 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' //MVVM+LiveData @@ -112,9 +112,11 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //单项/数字、二三级联动、日期/时间等滚轮选择器 - implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' - //高德导航、定位、地图三合一 - implementation 'com.amap.api:navi-3dmap:latest.integration' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.11' + //高德地图 + implementation 'com.amap.api:3dmap:latest.integration' + //高德地图搜索 + implementation 'com.amap.api:search:8.1.0' //绕过Android 11反射限制 implementation 'com.github.tiann:FreeReflection:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt new file mode 100644 index 0000000..3f2ca80 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnDistanceSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnDistanceSearchListener { + fun onDistanceSearched(distance: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt new file mode 100644 index 0000000..3f1448b --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/callback/OnGeocodeSearchListener.kt @@ -0,0 +1,5 @@ +package com.casic.birmm.inspect.callback + +interface OnGeocodeSearchListener { + fun onRegionCodeSearched(address: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt index 12c92e6..bea64eb 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ArrayList.kt @@ -1,5 +1,13 @@ package com.casic.birmm.inspect.extensions +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.route.DistanceSearch +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.model.RoutePointModel +import java.text.DecimalFormat + + /** * ArrayList扩展方法 */ @@ -25,4 +33,39 @@ result.add(it) } return result +} + +private val distanceSearch by lazy { DistanceSearch(BaseApplication.get()) } +private val distanceQuery by lazy { DistanceSearch.DistanceQuery() } +private val decimalFormat by lazy { DecimalFormat("#.##") } + +fun ArrayList.calculateDistance(listener: OnDistanceSearchListener) { + if (this.isEmpty()) { + listener.onDistanceSearched("0.00") + } + + val last = this.last() + val dest = LatLonPoint(last.lat, last.lng) + + //去掉最后一个点 + this.removeLast() + val latLonPoints: ArrayList = ArrayList() + this.forEach { + latLonPoints.add(LatLonPoint(it.lat, it.lng)) + } + + distanceQuery.origins = latLonPoints + distanceQuery.destination = dest + distanceQuery.type = DistanceSearch.TYPE_WALK_DISTANCE + distanceSearch.calculateRouteDistanceAsyn(distanceQuery) + distanceSearch.setDistanceSearchListener { distanceResult, errorCode -> + if (errorCode == 1000) { + //DistanceResult返回的是单位是米 + val temp = distanceResult.distanceResults[0].distance + val distance = temp / 1000 + listener.onDistanceSearched(decimalFormat.format(distance)) + } else { + listener.onDistanceSearched("0.00") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt new file mode 100644 index 0000000..5ed1321 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/LatLng.kt @@ -0,0 +1,28 @@ +package com.casic.birmm.inspect.extensions + +import com.amap.api.maps.model.LatLng +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.casic.birmm.inspect.base.BaseApplication +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener + +private val geocoderSearch by lazy { GeocodeSearch(BaseApplication.get()) } + +fun LatLng.toChinese(listener: OnGeocodeSearchListener) { + val queryParam = RegeocodeQuery( + LatLonPoint(this.latitude, this.longitude), 200f, GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult, code: Int) { + if (code == 1000) { + listener.onRegionCodeSearched(regeocodeResult.regeocodeAddress.formatAddress) + } + } + + override fun onGeocodeSearched(geocodeResult: GeocodeResult?, i: Int) {} + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 477e914..b0c666a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -1,9 +1,15 @@ package com.casic.birmm.inspect.fragment import android.os.Handler +import android.widget.TextView import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity @@ -85,7 +91,6 @@ override fun onResume() { super.onResume() - pageIndex = 1 getInspectionList() } @@ -115,17 +120,38 @@ val routeModels = if (routeJson.isEmpty()) { ArrayList() } else { - gson.fromJson>( + gson.fromJson>( routeJson, - object : TypeToken>() {}.type + object : TypeToken>() {}.type ) } + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView, "巡检人:${item.user}") - .setText( - R.id.inspectDateView, "巡检时间:${item.startTime} ~ ${item.endTime}" - ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) } } inspectRecyclerView.addItemDecoration( diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 812d329..f3de4f3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -1,5 +1,7 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R @@ -11,13 +13,72 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_event.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : KotlinBaseFragment() { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { + + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081102) { + dataBeans = DataBaseManager.get.loadEvent() + } else if (msg.what == 2023081101) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val eventListAdapter = + object : NormalRecyclerAdapter( + R.layout.item_event_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: EventListModel.DataModel.RowsModel + ) { + if (!item.images.isNullOrBlank()) { + val imageArray = item.images!!.split(",") + lifecycleScope.launch(Dispatchers.Main) { + try { + val drawable = withContext(Dispatchers.IO) { + Glide.with(requireContext()).load(imageArray[0]) + .submit() + .get() + } + viewHolder.setImageResource(R.id.inspectImageView, drawable) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.inspectTypeView, "类型:${item.type}") + .setText(R.id.inspectDateView, "时间:${item.createTime}") + } + } + eventRecyclerView.adapter = eventListAdapter + eventListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, + t: EventListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.toJson()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_event @@ -30,50 +91,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadEvent() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val eventListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_event_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: EventListModel.DataModel.RowsModel - ) { - if (!item.images.isNullOrBlank()) { - val imageArray = item.images!!.split(",") - lifecycleScope.launch(Dispatchers.Main) { - try { - val drawable = withContext(Dispatchers.IO) { - Glide.with(requireContext()).load(imageArray[0]).submit() - .get() - } - viewHolder.setImageResource(R.id.inspectImageView, drawable) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectTypeView, "类型:${item.type}") - .setText(R.id.inspectDateView, "时间:${item.createTime}") - } - } - eventRecyclerView.adapter = eventListAdapter - eventListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: EventListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.toJson()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadEvent() + weakReferenceHandler.sendEmptyMessage(2023081101) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index f41008a..7bc6bea 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -1,17 +1,104 @@ package com.casic.birmm.inspect.single.fragment +import android.os.Handler +import android.os.Message +import android.widget.TextView +import com.amap.api.maps.model.LatLng import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnDistanceSearchListener +import com.casic.birmm.inspect.callback.OnGeocodeSearchListener +import com.casic.birmm.inspect.extensions.calculateDistance +import com.casic.birmm.inspect.extensions.toChinese import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.WeakReferenceHandler import kotlinx.android.synthetic.main.include_empty_view.* import kotlinx.android.synthetic.main.single_fragment_query_inspect.* -class QueryInspectionFragment : KotlinBaseFragment() { +class QueryInspectionFragment : KotlinBaseFragment(), Handler.Callback { + + private val gson by lazy { Gson() } + private var dataBeans: MutableList = ArrayList() + + companion object { + lateinit var weakReferenceHandler: WeakReferenceHandler + } + + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2023081202) { + dataBeans = DataBaseManager.get.loadInspection() + } else if (msg.what == 2023081201) { + if (dataBeans.size == 0) { + emptyView.show("抱歉,无法查询到相关记录", null) + } else { + emptyView.hide() + val inspectListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_inspect_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: InspectListModel.DataModel.RowsModel + ) { + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } + + val startLocationView = viewHolder.getView(R.id.startLocationView) + val endLocationView = viewHolder.getView(R.id.endLocationView) + LatLng(item.startLat, item.startLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + startLocationView.text = address + } + }) + + LatLng(item.endLat, item.endLng).toChinese(object : + OnGeocodeSearchListener { + override fun onRegionCodeSearched(address: String) { + endLocationView.text = address + } + }) + + val distanceView = viewHolder.getView(R.id.distanceView) + routeModels.calculateDistance(object : OnDistanceSearchListener { + override fun onDistanceSearched(distance: String) { + distanceView.text = distance + } + }) + + viewHolder.setText(R.id.inspectMsgView, item.name) + .setText(R.id.startTimeView, item.startTime) + .setText(R.id.endTimeView, item.endTime) + } + } + inspectRecyclerView.adapter = inspectListAdapter + inspectListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: InspectListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id.toString()) + } + }) + } + } + return true + } override fun initLayoutView(): Int = R.layout.single_fragment_query_inspect @@ -24,35 +111,16 @@ } override fun initData() { - val dataBeans = DataBaseManager.get.loadInspection() - if (dataBeans.size == 0) { - emptyView.show("抱歉,无法查询到相关记录", null) - } else { - emptyView.hide() - val inspectListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_inspect_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: InspectListModel.DataModel.RowsModel - ) { - viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectDateView, "上报时间:${item.date}") - } - } - inspectRecyclerView.adapter = inspectListAdapter - inspectListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked(position: Int, t: InspectListModel.DataModel.RowsModel) { - requireContext().navigatePageTo(t.id.toString()) - } - }) - } + weakReferenceHandler = WeakReferenceHandler(this) } override fun initEvent() { } + + override fun onResume() { + super.onResume() + dataBeans = DataBaseManager.get.loadInspection() + weakReferenceHandler.sendEmptyMessage(2023081201) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt index 72b7238..8569dc1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/DataBaseManager.kt @@ -9,6 +9,8 @@ import com.casic.birmm.inspect.model.InspectDetailModel import com.casic.birmm.inspect.model.InspectEventModel import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.single.fragment.QueryEventFragment +import com.casic.birmm.inspect.single.fragment.QueryInspectionFragment class DataBaseManager private constructor() { @@ -56,6 +58,8 @@ if (!isInspectionExist(inspectionId)) { inspectionDao.insert(bean) + //通知列表刷新 + QueryInspectionFragment.weakReferenceHandler.sendEmptyMessage(2023081202) } } @@ -204,6 +208,8 @@ bean.user = "超级管理员" if (!isEventExist(taskId)) { taskEventDao.insert(bean) + //通知列表刷新 + QueryEventFragment.weakReferenceHandler.sendEmptyMessage(2023081102) } } diff --git a/app/src/main/res/drawable/ic_dot_blue.xml b/app/src/main/res/drawable/ic_dot_blue.xml new file mode 100644 index 0000000..5e709c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_blue.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_dot_green.xml b/app/src/main/res/drawable/ic_dot_green.xml new file mode 100644 index 0000000..f2638aa --- /dev/null +++ b/app/src/main/res/drawable/ic_dot_green.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/item_event_rv_l.xml b/app/src/main/res/layout/item_event_rv_l.xml index e7d44d7..9e24bfd 100644 --- a/app/src/main/res/layout/item_event_rv_l.xml +++ b/app/src/main/res/layout/item_event_rv_l.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/dp_5" - android:layout_marginBottom="@dimen/dp_5" + android:layout_marginTop="@dimen/dp_5" android:background="@drawable/bg_solid_layout_white_radius_5" android:orientation="horizontal" android:padding="@dimen/dp_5"> diff --git a/app/src/main/res/layout/item_inspect_rv_l.xml b/app/src/main/res/layout/item_inspect_rv_l.xml index f2b0626..11f13e6 100644 --- a/app/src/main/res/layout/item_inspect_rv_l.xml +++ b/app/src/main/res/layout/item_inspect_rv_l.xml @@ -1,59 +1,172 @@ + + + android:orientation="horizontal"> - + - + - + + - + + + + + + + + + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/single_fragment_query_event.xml b/app/src/main/res/layout/single_fragment_query_event.xml index 47ef620..f2d7b92 100644 --- a/app/src/main/res/layout/single_fragment_query_event.xml +++ b/app/src/main/res/layout/single_fragment_query_event.xml @@ -4,7 +4,7 @@ android:id="@+id/rootView" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/white" + android:background="@color/mainBackground" android:orientation="vertical"> diff --git a/app/src/main/res/layout/single_fragment_query_inspect.xml b/app/src/main/res/layout/single_fragment_query_inspect.xml index b14c409..bcd8b78 100644 --- a/app/src/main/res/layout/single_fragment_query_inspect.xml +++ b/app/src/main/res/layout/single_fragment_query_inspect.xml @@ -4,7 +4,7 @@ android:id="@+id/rootView" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/white" + android:background="@color/mainBackground" android:orientation="vertical">