package com.casic.smarttube.fragment 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.model.ProjectGroupModel.DataModel import com.casic.smarttube.view.GroupDeviceActivity 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.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.dp2px 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.dialog.AlertInputDialog class OverviewFragment : KotlinBaseFragment<FragmentOverviewBinding>() { private val kTag = "OverviewFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } private val marginOffsets by lazy { 6.dp2px(requireContext()) } private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var groupListAdapter: NormalRecyclerAdapter<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() { } override fun initOnCreate(savedInstanceState: Bundle?) { binding.recyclerView.addItemDecoration( RecyclerViewItemOffsets( marginOffsets, marginOffsets shr 1, marginOffsets, marginOffsets shr 1 ) ) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] groupViewModel.groupData.observe(this) { if (it.code == 200) { bindRecyclerView(it) } } groupViewModel.getProGroupList(requireContext()) groupViewModel.changeGroupResultData.observe(this) { if (it.code == 200) { groupListAdapter.notifyItemChanged(clickedPosition) } } } override fun onResume() { super.onResume() groupViewModel.getProGroupList(requireContext()) } 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<DataModel>( R.layout.item_group_over_view_rv_l, it.data ) { override fun convertView( viewHolder: ViewHolder, position: Int, item: 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.groupNameView) { clickedPosition = position editGroupName(item) } if (item.latGaode.isBlank() || item.lngGaode.isBlank()) { viewHolder.setText( R.id.groupLocationView, "经纬度异常,无法查看具体位置" ) } else { searchLocation(item, viewHolder) } } } binding.recyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener<DataModel> { override fun onItemClicked(position: Int, item: DataModel) { requireContext().navigatePageTo<GroupDeviceActivity>(item.groupId) } }) } } } } private fun searchLocation(item: DataModel, viewHolder: ViewHolder) { 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) { } }) } private fun editGroupName(item: 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(requireContext(), 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(requireContext()) } binding.emptyView.setOnClickListener(object : EmptyView.OnClickListener { override fun onReloadButtonClicked() { groupViewModel.getProGroupList(requireContext()) } }) } }