diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_child_device_data.xml b/app/src/main/res/layout/item_child_device_data.xml new file mode 100644 index 0000000..9ff4ecf --- /dev/null +++ b/app/src/main/res/layout/item_child_device_data.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_child_device_data.xml b/app/src/main/res/layout/item_child_device_data.xml new file mode 100644 index 0000000..9ff4ecf --- /dev/null +++ b/app/src/main/res/layout/item_child_device_data.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_recycleview.xml b/app/src/main/res/layout/item_device_data_recycleview.xml new file mode 100644 index 0000000..8791bd2 --- /dev/null +++ b/app/src/main/res/layout/item_device_data_recycleview.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_child_device_data.xml b/app/src/main/res/layout/item_child_device_data.xml new file mode 100644 index 0000000..9ff4ecf --- /dev/null +++ b/app/src/main/res/layout/item_child_device_data.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_recycleview.xml b/app/src/main/res/layout/item_device_data_recycleview.xml new file mode 100644 index 0000000..8791bd2 --- /dev/null +++ b/app/src/main/res/layout/item_device_data_recycleview.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_title.xml b/app/src/main/res/layout/item_device_data_title.xml new file mode 100644 index 0000000..1891c4b --- /dev/null +++ b/app/src/main/res/layout/item_device_data_title.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_child_device_data.xml b/app/src/main/res/layout/item_child_device_data.xml new file mode 100644 index 0000000..9ff4ecf --- /dev/null +++ b/app/src/main/res/layout/item_child_device_data.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_recycleview.xml b/app/src/main/res/layout/item_device_data_recycleview.xml new file mode 100644 index 0000000..8791bd2 --- /dev/null +++ b/app/src/main/res/layout/item_device_data_recycleview.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_title.xml b/app/src/main/res/layout/item_device_data_title.xml new file mode 100644 index 0000000..1891c4b --- /dev/null +++ b/app/src/main/res/layout/item_device_data_title.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/load_image_error.png b/app/src/main/res/mipmap-xxhdpi/load_image_error.png new file mode 100644 index 0000000..357cbde --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/load_image_error.png Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_child_device_data.xml b/app/src/main/res/layout/item_child_device_data.xml new file mode 100644 index 0000000..9ff4ecf --- /dev/null +++ b/app/src/main/res/layout/item_child_device_data.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_recycleview.xml b/app/src/main/res/layout/item_device_data_recycleview.xml new file mode 100644 index 0000000..8791bd2 --- /dev/null +++ b/app/src/main/res/layout/item_device_data_recycleview.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_title.xml b/app/src/main/res/layout/item_device_data_title.xml new file mode 100644 index 0000000..1891c4b --- /dev/null +++ b/app/src/main/res/layout/item_device_data_title.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/load_image_error.png b/app/src/main/res/mipmap-xxhdpi/load_image_error.png new file mode 100644 index 0000000..357cbde --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/load_image_error.png Binary files differ diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ab8c901..a4f2648 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -138,4 +138,14 @@ @dimen/dp_10 true + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f601e1..4d7c573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataChildAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_child_device_data, parent, false) + ) + } + + override fun getItemCount(): Int = dataBean.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定子视图数据 + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.deviceDataView.text = dataBean[position] + if (position == dataBean.size - 1) { + holder.deviceDataView.setTextColor(R.color.mainThemeColor.convertColor(context)) + } else { + holder.deviceDataView.setTextColor(R.color.subTextColor.convertColor(context)) + } + //绑定事件 + holder.deviceDataView.setOnClickListener { + if (listener != null && position == dataBean.size - 1) { + listener!!.onOperationClicked() + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceDataView: TextView = view.findViewById(R.id.deviceDataView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onOperationClicked() + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt new file mode 100644 index 0000000..c9fba19 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataListAdapter.kt @@ -0,0 +1,67 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.model.DeviceDataModel + +class DeviceDataListAdapter( + private val context: Context, private val dataBeans: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataListAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_recycleview, parent, false) + ) + } + + override fun getItemCount(): Int = dataBeans.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val dataBean = ArrayList() + dataBean.add((position + 1).toString()) + dataBean.add(dataBeans[position].watchType) + dataBean.add(dataBeans[position].devcode) + dataBean.add(dataBeans[position].installDate) + dataBean.add(dataBeans[position].data) + dataBean.add(dataBeans[position].onlineStateName) + dataBean.add(dataBeans[position].logtime) + dataBean.add("查看历史数据") + + //绑定子视图数据 + val childDataAdapter = DeviceDataChildAdapter(context, dataBean) + holder.childRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + holder.childRecyclerView.adapter = childDataAdapter + childDataAdapter.setOnItemClickListener(object : + DeviceDataChildAdapter.OnItemClickListener { + override fun onOperationClicked() { + if (listener != null) { + listener!!.onChildClicked(dataBean[2]) + } + } + }) + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var childRecyclerView: RecyclerView = view.findViewById(R.id.childRecyclerView) + } + + private var listener: OnChildItemClickListener? = null + + interface OnChildItemClickListener { + fun onChildClicked(deviceCode: String) + } + + fun setOnItemClickListener(onClickListener: OnChildItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt new file mode 100644 index 0000000..cdc32f5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/DeviceDataTitleAdapter.kt @@ -0,0 +1,43 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil + +class DeviceDataTitleAdapter(private var context: Context) : + RecyclerView.Adapter() { + + private val titleArray = + arrayListOf("序号", "监控内容", "设备编号", "设备安装日期", "最新数据", "设备状态", "最后上传时间", "操作") + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, viewType: Int + ): DeviceDataTitleAdapter.ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_device_data_title, parent, false) + ) + } + + override fun getItemCount(): Int = titleArray.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val layoutParams = holder.itemView.layoutParams + if (position == 0) { + layoutParams.width = SizeUtil.dp2px(context, 55f) + } else { + layoutParams.width = SizeUtil.dp2px(context, 110f) + } + holder.itemView.layoutParams = layoutParams + holder.titleView.text = titleArray[position] + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var titleView: TextView = view.findViewById(R.id.titleView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt new file mode 100644 index 0000000..c15241c --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ImageRecyclerViewAdapter.kt @@ -0,0 +1,63 @@ +package com.casic.app.smartwell.sanxi.adapter + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.app.smartwell.sanxi.R +import com.pengxh.app.multilib.utils.SizeUtil +import com.qmuiteam.qmui.util.QMUIDisplayHelper + + +/** + * 不可删减九宫格 + * */ +class ImageRecyclerViewAdapter(private val context: Context, imageData: ArrayList) : + RecyclerView.Adapter() { + + private val imageUrls: ArrayList = imageData + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val layoutWidth: Int = + SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = QMUIDisplayHelper.dp2px(context, 3) + val itemSize = (layoutWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context).load(imageUrls[position]) + .apply(RequestOptions().error(R.mipmap.load_image_error)) + .into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + itemClickListener!!.onItemClick(position) + } + } + + override fun getItemCount(): Int = imageUrls.size + + private var itemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + itemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java new file mode 100644 index 0000000..d6ce151 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DeviceDataModel.java @@ -0,0 +1,136 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DeviceDataModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String data; + private String devcode; + private String deviceId; + private String installDate; + private String logtime; + private String onlineState; + private String onlineStateName; + private String type; + private String value; + private String watchType; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 7bf15e6..2a451ec 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -270,7 +270,7 @@ * @param id 窨井ID */ @GET("/well/watchDataByWell") - suspend fun obtainMonitorResult( + suspend fun obtainDeviceDataByWell( @Header("token") token: String, @Query("id") id: String ): String diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index b40c104..47a00ed 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -258,13 +258,13 @@ return api.obtainWellType(AuthenticationHelper.token!!) } -// /** -// * 获取井下监控设备列表 -// */ -// suspend fun obtainMonitorResult(id: String): String { -// return api.obtainMonitorResult(AuthenticationHelper.token!!, id) -// } -// + /** + * 获取井下监控设备列表 + */ + suspend fun obtainDeviceDataByWell(id: String): String { + return api.obtainDeviceDataByWell(AuthenticationHelper.token!!, id) + } + // /** // * 闸井布防撤防 // */ diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt new file mode 100644 index 0000000..d9635f9 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/BigImageActivity.kt @@ -0,0 +1,91 @@ +package com.casic.app.smartwell.sanxi.view; + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.utils.PageNavigationManager +import com.casic.app.smartwell.sanxi.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, container, false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.currentActivity()?.finish() + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt new file mode 100644 index 0000000..b34be03 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -0,0 +1,146 @@ +package com.casic.app.smartwell.sanxi.view + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +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.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter +import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter +import com.casic.app.smartwell.sanxi.adapter.ImageRecyclerViewAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import kotlinx.android.synthetic.main.activity_well_list_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class WellListDetailActivity : BaseActivity() { + + private val kTag = "WellListDetailActivity" + private val geocoderSearch by lazy { GeocodeSearch(this) } + private lateinit var wellViewModel: WellViewModel + private lateinit var wellBeanJson: String + + override fun initLayoutView(): Int = R.layout.activity_well_list_detail + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "井详情" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + val wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + if (wellBean != null) { + wellNameView.text = wellBean.wellName + wellCodeView.text = wellBean.wellCode + wellTypeView.text = wellBean.wellTypeName + ownerShipView.text = wellBean.deptName + val deep = if (wellBean.deep.isBlank()) { + 0 + } else { + wellBean.deep + } + wellDepthView.text = deep.toString() + wellStateView.text = wellBean.bfztName + longitudeView.text = wellBean.lngGaode + latitudeView.text = wellBean.latGaode + + if (wellBean.photos.toString().isBlank()) { + imageRecyclerView.visibility = View.GONE + photoTipsView.text = "无" + } else { + imageRecyclerView.visibility = View.VISIBLE + photoTipsView.visibility = View.GONE + //处理图片地址 + val urls: ArrayList = ArrayList() + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + urls.add(path.combineImagePath()) + } + } + val imageAdapter = ImageRecyclerViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecyclerViewAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, urls) + } + } + }) + } + + //根据经纬度获取省市区县 + if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { + "井经纬度异常,无法查看完整位置信息".show() + return + } + val queryParam = RegeocodeQuery( + LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), + 200f, + GeocodeSearch.AMAP + ) + geocoderSearch.getFromLocationAsyn(queryParam) + geocoderSearch.setOnGeocodeSearchListener(object : + GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { + if (rCode == 1000) { + districtView.text = result?.regeocodeAddress?.formatAddress + } + } + + override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { + + } + }) + addressView.text = wellBean.position + maintenanceView.text = wellBean.responsibleDeptName + + //绑定井下设备数据 + wellViewModel.obtainDeviceDataByWell(wellBean.id.toString()) + wellViewModel.deviceDataModel.observe(this, { + if (it.code == 200) { + + val deviceDataTitleAdapter = DeviceDataTitleAdapter(this) + titleRecyclerView!!.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + titleRecyclerView!!.adapter = deviceDataTitleAdapter + + val deviceDataListAdapter = DeviceDataListAdapter(this, it.data) + deviceRecyclerView!!.layoutManager = LinearLayoutManager(this) + deviceRecyclerView!!.adapter = deviceDataListAdapter + deviceDataListAdapter.setOnItemClickListener(object : + DeviceDataListAdapter.OnChildItemClickListener { + override fun onChildClicked(deviceCode: String) { + //TODO 待完善 + deviceCode.show() + } + }) + } + }) + } + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 57eb129..1202bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -15,6 +15,7 @@ import com.casic.app.smartwell.sanxi.extensions.navigatePageTo import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.extensions.showEmptyPage +import com.casic.app.smartwell.sanxi.extensions.toJson import com.casic.app.smartwell.sanxi.model.OwnerShipModel import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.WeakReferenceHandler @@ -209,12 +210,7 @@ wellListAdapter.setOnItemClickListener(object : WellListAdapter.OnItemClickListener { override fun onClicked(position: Int) { - val wellId = dataBeans[position].id.toString() - if (wellId.isBlank()) { - "井编号异常,无法查看详情".show() - return - } - + navigatePageTo(dataBeans[position].toJson()) } override fun onHistoryClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 1ce5a4f..515cb14 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -22,6 +22,7 @@ val wellTypeAndCountModel = MutableLiveData() val wellListPageModel = MutableLiveData() val wellTypeModel = MutableLiveData() + val deviceDataModel = MutableLiveData() fun obtainWellDetail(id: String) = launch({ loadState.value = LoadState.Loading @@ -117,4 +118,18 @@ }, { it.printStackTrace() }) + + fun obtainDeviceDataByWell(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDataByWell(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_gray.xml b/app/src/main/res/drawable/bg_stroke_layout_gray.xml new file mode 100644 index 0000000..cce49f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_layout_gray.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_monitor_data.xml b/app/src/main/res/drawable/ic_monitor_data.xml new file mode 100644 index 0000000..9e6b820 --- /dev/null +++ b/app/src/main/res/drawable/ic_monitor_data.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..1230146 --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_well_detail.xml b/app/src/main/res/layout/activity_well_detail.xml index f719734..62bb825 100644 --- a/app/src/main/res/layout/activity_well_detail.xml +++ b/app/src/main/res/layout/activity_well_detail.xml @@ -20,7 +20,7 @@ + android:text="井名称" /> + android:text="井类型" /> + android:text="井编号" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_child_device_data.xml b/app/src/main/res/layout/item_child_device_data.xml new file mode 100644 index 0000000..9ff4ecf --- /dev/null +++ b/app/src/main/res/layout/item_child_device_data.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_recycleview.xml b/app/src/main/res/layout/item_device_data_recycleview.xml new file mode 100644 index 0000000..8791bd2 --- /dev/null +++ b/app/src/main/res/layout/item_device_data_recycleview.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_data_title.xml b/app/src/main/res/layout/item_device_data_title.xml new file mode 100644 index 0000000..1891c4b --- /dev/null +++ b/app/src/main/res/layout/item_device_data_title.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/load_image_error.png b/app/src/main/res/mipmap-xxhdpi/load_image_error.png new file mode 100644 index 0000000..357cbde --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/load_image_error.png Binary files differ diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ab8c901..a4f2648 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -138,4 +138,14 @@ @dimen/dp_10 true + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..064f301 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file