增加看板进数据编辑页面

This commit is contained in:
squallzhjch 2023-05-04 14:10:30 +08:00
parent efe5d43555
commit ebbb9b99b2
15 changed files with 121 additions and 52 deletions

View File

@ -5,6 +5,7 @@ plugins {
id 'com.google.dagger.hilt.android' id 'com.google.dagger.hilt.android'
id 'realm-android' id 'realm-android'
id 'kotlin-parcelize' // id 'kotlin-parcelize' //
id 'androidx.navigation.safeargs.kotlin'//Safe Args传递数据
} }
android { android {
namespace 'com.navinfo.omqs' namespace 'com.navinfo.omqs'
@ -109,6 +110,8 @@ dependencies {
// spatialite文件 // spatialite文件
implementation 'com.github.sevar83:android-spatialite:2.0.1' implementation 'com.github.sevar83:android-spatialite:2.0.1'
//fragment
implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
} }
// //
kapt { kapt {

View File

@ -0,0 +1,15 @@
package com.navinfo.omqs.bean
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class SignBean(
//图标ID
val iconId: Int,
val distance: Int = 0,
val iconText: String = "",
val elementId: String = "",
val linkId: String,
val geometry: String,
) : Parcelable

View File

@ -20,7 +20,6 @@ import org.oscim.core.MercatorProjection
import javax.inject.Inject import javax.inject.Inject
import kotlin.streams.toList import kotlin.streams.toList
@RequiresApi(Build.VERSION_CODES.N)
class RealmOperateHelper() { class RealmOperateHelper() {
@Inject @Inject
lateinit var niMapController: NIMapController lateinit var niMapController: NIMapController
@ -32,6 +31,7 @@ class RealmOperateHelper() {
* @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL * @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL
* @param sort 是否需要排序 * @param sort 是否需要排序
* */ * */
@RequiresApi(Build.VERSION_CODES.N)
suspend fun queryLink( suspend fun queryLink(
point: Point, point: Point,
buffer: Double = DEFAULT_BUFFER, buffer: Double = DEFAULT_BUFFER,
@ -102,6 +102,7 @@ class RealmOperateHelper() {
* @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL * @param bufferType 点位外扩距离的单位 -Meter像素-PIXEL
* @param sort 是否需要排序 * @param sort 是否需要排序
* */ * */
@RequiresApi(Build.VERSION_CODES.N)
suspend fun queryElement( suspend fun queryElement(
point: Point, point: Point,
buffer: Double = DEFAULT_BUFFER, buffer: Double = DEFAULT_BUFFER,
@ -154,12 +155,13 @@ class RealmOperateHelper() {
suspend fun queryLinkByLinkPid(linkPid: String): MutableList<RenderEntity> { suspend fun queryLinkByLinkPid(linkPid: String): MutableList<RenderEntity> {
val result = mutableListOf<RenderEntity>() val result = mutableListOf<RenderEntity>()
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) val realm = Realm.getDefaultInstance()
val realmList = realm.where(RenderEntity::class.java)
.notEqualTo("table", "OMDB_RD_LINK") .notEqualTo("table", "OMDB_RD_LINK")
.and() .and()
.equalTo("properties['${LinkTable.linkPid}']", linkPid) .equalTo("properties['${LinkTable.linkPid}']", linkPid)
.findAll() .findAll()
result.addAll(realmList) result.addAll(realm.copyFromRealm(realmList))
} }
return result return result
} }

View File

@ -1,16 +1,12 @@
package com.navinfo.omqs.ui.activity.map package com.navinfo.omqs.ui.activity.map
import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.blankj.utilcode.util.ToastUtils
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.NiLocationListener
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.databinding.ActivityMainBinding
@ -35,7 +31,25 @@ class MainActivity : BaseActivity() {
@Inject @Inject
lateinit var offlineMapDownloadManager: OfflineMapDownloadManager lateinit var offlineMapDownloadManager: OfflineMapDownloadManager
private val signAdapter by lazy { SignAdapter() } private val rightController by lazy {
findNavController(R.id.main_activity_right_fragment)
}
private val signAdapter by lazy {
SignAdapter { position, signBean ->
// val directions =
// EmptyFragmentDirections.emptyFragmentToEvaluationResultFragment(
// )
// rightController.navigate(directions)
rightController.currentDestination?.let {
if(it.id == R.id.EvaluationResultFragment){
val bundle = Bundle()
bundle.putParcelable("SignBean", signBean)
rightController.navigate(R.id.EvaluationResultFragment, bundle)
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
@ -113,8 +127,7 @@ class MainActivity : BaseActivity() {
* 点击录音按钮 * 点击录音按钮
*/ */
fun voiceOnclick() { fun voiceOnclick() {
val naviController = findNavController(R.id.main_activity_right_fragment) rightController.navigate(R.id.EvaluationResultFragment)
naviController.navigate(R.id.EvaluationResultFragment)
} }
// override fun onBackPressed() { // override fun onBackPressed() {

View File

@ -5,27 +5,22 @@ import android.content.DialogInterface
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.navigation.findNavController import androidx.navigation.findNavController
import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.dao.impl.TraceDataBase
import com.navinfo.collect.library.data.entity.NiLocation
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.NiLocationListener
import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener
import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.collect.library.utils.GeometryToolsKt
import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.dialog.CommonDialog
import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.manager.TakePhotoManager
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ActivityContext
import dagger.hilt.android.qualifiers.ApplicationContext
import io.realm.RealmSet import io.realm.RealmSet
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -137,6 +132,9 @@ class MainViewModel @Inject constructor(
iconId = R.drawable.icon_speed_limit, iconId = R.drawable.icon_speed_limit,
iconText = element.name, iconText = element.name,
distance = distance.toInt(), distance = distance.toInt(),
elementId = element.id,
linkId = linkId,
geometry = element.geometry
) )
) )
} }
@ -161,7 +159,7 @@ class MainViewModel @Inject constructor(
override fun onCleared() { override fun onCleared() {
super.onCleared() super.onCleared()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mapController.lineHandler.removeLine() mapController.lineHandler.removeLine()
} }
} }

View File

@ -3,11 +3,13 @@ package com.navinfo.omqs.ui.activity.map
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.databinding.AdapterSignBinding import com.navinfo.omqs.databinding.AdapterSignBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder import com.navinfo.omqs.ui.other.BaseViewHolder
class SignAdapter : BaseRecyclerViewAdapter<SignBean>() { class SignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) :
BaseRecyclerViewAdapter<SignBean>() {
override fun getItemViewRes(position: Int): Int { override fun getItemViewRes(position: Int): Int {
return R.layout.adapter_sign return R.layout.adapter_sign
} }
@ -23,6 +25,8 @@ class SignAdapter : BaseRecyclerViewAdapter<SignBean>() {
val item = data[position] val item = data[position]
bd.signMainIcon.background = holder.viewBinding.root.context.getDrawable(item.iconId) bd.signMainIcon.background = holder.viewBinding.root.context.getDrawable(item.iconId)
bd.signMainIcon.text = item.iconText bd.signMainIcon.text = item.iconText
bd.root.setOnClickListener {
itemListener?.invoke(position, item)
}
} }
} }

View File

@ -1,8 +0,0 @@
package com.navinfo.omqs.ui.activity.map
data class SignBean(
//图标ID
val iconId: Int,
val distance: Int = 0,
val iconText: String = ""
)

View File

@ -8,6 +8,7 @@ import androidx.databinding.DataBindingUtil
import androidx.navigation.NavOptions import androidx.navigation.NavOptions
import androidx.navigation.findNavController import androidx.navigation.findNavController
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.databinding.FragmentEvaluationResultBinding import com.navinfo.omqs.databinding.FragmentEvaluationResultBinding
import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels import com.navinfo.omqs.ui.other.shareViewModels
@ -18,6 +19,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
private lateinit var binding: FragmentEvaluationResultBinding private lateinit var binding: FragmentEvaluationResultBinding
private val viewModel by shareViewModels<EvaluationResultViewModel>("QsRecode") private val viewModel by shareViewModels<EvaluationResultViewModel>("QsRecode")
// private val args:EmptyFragmentArgs by navArgs()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View { ): View {
@ -56,15 +58,21 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
/** /**
* 读取元数据 * 读取元数据
*/ */
if (arguments != null) { // val id = args.qsId
val id = requireArguments().getString("QsId") var id: String = ""
if (id != null) { var signBean: SignBean? = null
viewModel.initData(id) arguments?.let {
} else { id = it.getString("QsId", "")
viewModel.initNewData() try {
signBean = it.getParcelable("SignBean")
} catch (e: java.lang.Exception) {
} }
}
if (id == null || id.isEmpty()) {
viewModel.initNewData(signBean)
} else { } else {
viewModel.initNewData() viewModel.initData(id)
} }
// //监听大分类数据变化 // //监听大分类数据变化

View File

@ -10,6 +10,7 @@ import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.bean.SignBean
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.db.RoomAppDatabase import com.navinfo.omqs.db.RoomAppDatabase
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -73,7 +74,7 @@ class EvaluationResultViewModel @Inject constructor(
super.onCleared() super.onCleared()
Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}") Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}")
mapController.markerHandle.removeMarker(markerTitle) mapController.markerHandle.removeMarker(markerTitle)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mapController.lineHandler.removeLine() mapController.lineHandler.removeLine()
} }
} }
@ -82,12 +83,13 @@ class EvaluationResultViewModel @Inject constructor(
/** /**
* 查询数据库获取问题分类 * 查询数据库获取问题分类
*/ */
fun initNewData() { fun initNewData(bean: SignBean?) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
getClassTypeList() getClassTypeList()
getProblemLinkList() getProblemLinkList()
} }
val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint() val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint()
if (bean == null) {
geoPoint?.let { geoPoint?.let {
liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText()
mapController.markerHandle.addMarker(geoPoint, markerTitle) mapController.markerHandle.addMarker(geoPoint, markerTitle)
@ -95,10 +97,28 @@ class EvaluationResultViewModel @Inject constructor(
captureLink(geoPoint.longitude, geoPoint.latitude) captureLink(geoPoint.longitude, geoPoint.latitude)
} }
} }
} else {
liveDataQsRecordBean.value?.run {
elementId = bean.elementId
linkId = bean.linkId
if (linkId.isNotEmpty()) {
viewModelScope.launch {
val link = realmOperateHelper.queryLink(linkId)
link?.let { l ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mapController.lineHandler.showLine(l.geometry)
}
}
}
}
}
val point = GeometryTools.createGeoPoint(bean.geometry)
mapController.markerHandle.addMarker(point, markerTitle)
}
} }
/** /**
* 捕捉到路 * 捕捉
*/ */
private suspend fun captureLink(longitude: Double, latitude: Double) { private suspend fun captureLink(longitude: Double, latitude: Double) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

View File

@ -1,7 +1,9 @@
package com.navinfo.omqs.ui.fragment.evaluationresult package com.navinfo.omqs.ui.fragment.evaluationresult
import android.os.Build
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.RequiresApi
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.TextItemSelectBinding import com.navinfo.omqs.databinding.TextItemSelectBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
@ -21,6 +23,7 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) :
return BaseViewHolder(viewBinding) return BaseViewHolder(viewBinding)
} }
@RequiresApi(Build.VERSION_CODES.M)
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val bd = holder.viewBinding as TextItemSelectBinding val bd = holder.viewBinding as TextItemSelectBinding
val title = data[position] val title = data[position]

View File

@ -50,7 +50,7 @@ class QsRecordListFragment : BaseFragment(){
binding.qsRecyclerview.addItemDecoration(itemDecoration) binding.qsRecyclerview.addItemDecoration(itemDecoration)
viewModel.getList(requireContext()) viewModel.getList(requireContext())
// itemClick // itemClick
adapter!!.setOnKotlinItemClickListener(object : QsRecordListAdapter.IKotlinItemClickListener { adapter.setOnKotlinItemClickListener(object : QsRecordListAdapter.IKotlinItemClickListener {
override fun onItemClickListener(position: Int) { override fun onItemClickListener(position: Int) {
viewModel.onItemClickListener(activity as MainActivity,position) viewModel.onItemClickListener(activity as MainActivity,position)
findNavController().popBackStack() findNavController().popBackStack()

View File

@ -82,7 +82,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:background="@drawable/fm_card_map_down_status_bg" android:background="@drawable/fm_card_map_down_status_bg"
android:onClick="@{fragment.onClick}" android:onClick="@{fragment::onClick}"
android:text="@{viewModel.liveDataQsRecordBean.phenomenon}" /> android:text="@{viewModel.liveDataQsRecordBean.phenomenon}" />
<TextView <TextView
@ -91,7 +91,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:background="@drawable/fm_card_map_down_status_bg" android:background="@drawable/fm_card_map_down_status_bg"
android:onClick="@{fragment.onClick}" android:onClick="@{fragment::onClick}"
android:text="@{viewModel.liveDataQsRecordBean.problemLink}" /> android:text="@{viewModel.liveDataQsRecordBean.problemLink}" />
<TextView <TextView
@ -100,7 +100,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:background="@drawable/fm_card_map_down_status_bg" android:background="@drawable/fm_card_map_down_status_bg"
android:onClick="@{fragment.onClick}" android:onClick="@{fragment::onClick}"
android:text="@{viewModel.liveDataQsRecordBean.cause}" /> android:text="@{viewModel.liveDataQsRecordBean.cause}" />
<TextView <TextView

View File

@ -9,16 +9,25 @@
android:id="@+id/EmptyFragment" android:id="@+id/EmptyFragment"
android:name="com.navinfo.omqs.ui.fragment.empty.EmptyFragment" android:name="com.navinfo.omqs.ui.fragment.empty.EmptyFragment"
android:label="空页面" android:label="空页面"
tools:layout="@layout/fragment_empty"></fragment> tools:layout="@layout/fragment_empty">
<!-- <action-->
<!-- android:id="@+id/EmptyFragment_to_EvaluationResultFragment"-->
<!-- app:destination="@id/EvaluationResultFragment" />-->
<!-- <argument-->
<!-- android:name="QsId"-->
<!-- app:argType="string"-->
<!-- app:nullable="true" />-->
<!-- <argument-->
<!-- android:name="SignBean"-->
<!-- app:argType="com.navinfo.omqs.ui.activity.map.SignBean"-->
<!-- />-->
</fragment>
<fragment <fragment
android:id="@+id/EvaluationResultFragment" android:id="@+id/EvaluationResultFragment"
android:name="com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment" android:name="com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment"
android:label="评测页面" android:label="评测页面"
tools:layout="@layout/fragment_evaluation_result"> tools:layout="@layout/fragment_evaluation_result">
<argument
android:name="QsId"
app:argType="string"
app:nullable="true" />
</fragment> </fragment>
</navigation> </navigation>

View File

@ -4,6 +4,7 @@
buildscript { buildscript {
dependencies { dependencies {
classpath "io.realm:realm-gradle-plugin:10.11.1" classpath "io.realm:realm-gradle-plugin:10.11.1"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3"
} }
} }
plugins { plugins {
@ -11,4 +12,5 @@ plugins {
id 'com.android.library' version '7.3.1' apply false id 'com.android.library' version '7.3.1' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
id 'com.google.dagger.hilt.android' version '2.44' apply false id 'com.google.dagger.hilt.android' version '2.44' apply false
} }

View File

@ -26,7 +26,7 @@ import org.oscim.layers.vector.VectorLayer
import org.oscim.layers.vector.geometries.Style import org.oscim.layers.vector.geometries.Style
import org.oscim.map.Map import org.oscim.map.Map
@RequiresApi(Build.VERSION_CODES.N) @RequiresApi(Build.VERSION_CODES.M)
class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView), class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView),
Map.UpdateListener { Map.UpdateListener {