package com.casic.smarttube.fragment import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider 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.smarttube.R import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity import com.casic.smarttube.view.GroupDeviceMapActivity import com.casic.smarttube.vm.ProjectGroupViewModel 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.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.widget.EmptyView import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertInputDialog class OverviewFragment : KotlinBaseFragment<FragmentOverviewBinding>() { private val kTag = "OverviewFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var groupListAdapter: NormalRecyclerAdapter<ProjectGroupModel.DataModel> private var clickedPosition = 0 private var isRefresh = false override fun initViewBinding( inflater: LayoutInflater, container: ViewGroup? ): FragmentOverviewBinding { return FragmentOverviewBinding.inflate(inflater, container, false) } override fun setupTopBarLayout() { binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { } override fun onRightClick() { requireContext().navigatePageTo<GroupDeviceMapActivity>() } }) } override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] groupViewModel.groupModel.observe(this) { if (it.code == 200) { bindRecyclerView(it) } } groupViewModel.changeGroupResult.observe(this) { if (it.code == 200) { groupListAdapter.notifyItemChanged(clickedPosition) } } } override fun onResume() { super.onResume() groupViewModel.getProGroupList() } private fun bindRecyclerView(it: ProjectGroupModel) { val dataRows = it.data when { isRefresh -> { binding.refreshView.finishRefresh() isRefresh = false groupListAdapter.refresh(dataRows) } else -> { if (dataRows.size == 0) { binding.emptyView.visibility = View.VISIBLE binding.recyclerView.visibility = View.GONE } else { binding.emptyView.visibility = View.GONE binding.recyclerView.visibility = View.VISIBLE groupListAdapter = object : NormalRecyclerAdapter<ProjectGroupModel.DataModel>( R.layout.item_group_over_view_rv_l, it.data ) { override fun convertView( viewHolder: ViewHolder, position: Int, item: ProjectGroupModel.DataModel ) { viewHolder.setText(R.id.groupNameView, item.groupId) .setText(R.id.totalDeviceNumView, item.totalDevice) .setText(R.id.inUseDeviceNumView, item.alive) .setText(R.id.notUseDeviceNumView, item.unalive) .setOnClickListener(R.id.editGroupNameView) { clickedPosition = position editGroupName(item) } if (item.latGaode.isBlank() || item.lngGaode.isBlank()) { viewHolder.setText( R.id.groupLocationView, "经纬度异常,无法查看具体位置" ) } else { val point = LatLonPoint(item.latGaode.toDouble(), item.lngGaode.toDouble()) val queryParam = RegeocodeQuery(point, 200f, GeocodeSearch.AMAP) geocoderSearch.getFromLocationAsyn(queryParam) geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched( result: RegeocodeResult?, rCode: Int ) { if (rCode == 1000) { viewHolder.setText( R.id.groupLocationView, String.format("${result?.regeocodeAddress?.formatAddress}") ) } } override fun onGeocodeSearched( result: GeocodeResult?, rCode: Int ) { } }) } } } binding.recyclerView.addItemDecoration( RecyclerViewItemDivider(0f, 0f, Color.LTGRAY) ) binding.recyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener<ProjectGroupModel.DataModel> { override fun onItemClicked( position: Int, item: ProjectGroupModel.DataModel ) { requireContext().navigatePageTo<GroupDeviceActivity>(item.groupId) } }) } } } } private fun editGroupName(item: ProjectGroupModel.DataModel) { AlertInputDialog.Builder() .setContext(requireContext()) .setTitle("提示") .setHintMessage("请输入新的项目名") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { } override fun onConfirmClick(value: String) { item.groupId = value groupViewModel.changeGroupId(item.groupId, value) } }).build().show() } override fun observeRequestState() { groupViewModel.loadState.observe(this) { if (isRefresh) { return@observe } when (it) { LoadState.Loading -> LoadingDialog.show(requireActivity(), "数据加载中,请稍后...") LoadState.Success -> { LoadingDialog.dismiss() } LoadState.Fail -> { LoadingDialog.dismiss() "数据加载失败,请重试".show(requireContext()) } } } } override fun initEvent() { binding.refreshView.setOnRefreshListener { isRefresh = true groupViewModel.getProGroupList() } binding.emptyView.setOnClickListener(object : EmptyView.OnClickListener { override fun onReloadButtonClicked() { groupViewModel.getProGroupList() } }) } }