日报2025512
团队作业开发
设备状况及报修功能
package com.example.sanpaias.activity
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.example.sanpaias.R
import com.example.sanpaias.adapter.DeviceAdapter
import com.example.sanpaias.entity.Device
import com.example.sanpaias.network.RetrofitClient
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class DeviceListActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var swipeRefreshLayout: SwipeRefreshLayout
private lateinit var deviceAdapter: DeviceAdapter
private var deviceList = mutableListOf<Device>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_device_list)
// 设置返回按钮
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = "设备列表"
// 初始化视图
recyclerView = findViewById(R.id.recyclerView)
swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout)
// 设置RecyclerView
recyclerView.layoutManager = LinearLayoutManager(this)
deviceAdapter = DeviceAdapter(this, deviceList) { device ->
// 点击设备项时跳转到故障报修页面
if (device.status == "正常") {
val intent = Intent(this, DeviceFaultReportActivity::class.java)
// 确保正确传递设备对象
intent.putExtra("device", device)
startActivity(intent)
} else {
Toast.makeText(this, "该设备当前状态为${device.status},无法报修", Toast.LENGTH_SHORT).show()
}
}
recyclerView.adapter = deviceAdapter
// 设置下拉刷新
swipeRefreshLayout.setOnRefreshListener {
loadDevices()
}
// 加载设备数据
loadDevices()
}
private fun loadDevices() {
swipeRefreshLayout.isRefreshing = true
CoroutineScope(Dispatchers.Main).launch {
try {
val response = withContext(Dispatchers.IO) {
RetrofitClient.instance.getAllDevices()
}
if (response.isSuccessful && response.body()?.code == 200) {
val devices = response.body()?.data ?: emptyList()
deviceList.clear()
deviceList.addAll(devices)
deviceAdapter.notifyDataSetChanged()
// 处理空列表情况
if (devices.isEmpty()) {
findViewById<View>(R.id.tvEmpty).visibility = View.VISIBLE
} else {
findViewById<View>(R.id.tvEmpty).visibility = View.GONE
}
} else {
Toast.makeText(this@DeviceListActivity,
"获取设备列表失败: ${response.body()?.msg ?: "未知错误"}",
Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this@DeviceListActivity,
"网络错误,请稍后重试",
Toast.LENGTH_SHORT).show()
} finally {
swipeRefreshLayout.isRefreshing = false
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
return true
}
return super.onOptionsItemSelected(item)
}
override fun onResume() {
super.onResume()
// 页面恢复时刷新数据
loadDevices()
}
}
package com.example.sanpaias.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.example.sanpaias.R
import com.example.sanpaias.entity.Device
class DeviceAdapter(
private val context: Context,
private val devices: List<Device>,
private val onItemClick: (Device) -> Unit
) : RecyclerView.Adapter<DeviceAdapter.DeviceViewHolder>() {
class DeviceViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val cardView: CardView = itemView.findViewById(R.id.cardView)
val tvDeviceId: TextView = itemView.findViewById(R.id.tvDeviceId)
val tvDeviceType: TextView = itemView.findViewById(R.id.tvDeviceType)
val tvLocation: TextView = itemView.findViewById(R.id.tvLocation)
val tvStatus: TextView = itemView.findViewById(R.id.tvStatus)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DeviceViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_device, parent, false)
return DeviceViewHolder(view)
}
override fun onBindViewHolder(holder: DeviceViewHolder, position: Int) {
val device = devices[position]
holder.tvDeviceId.text = "设备编号: ${device.deviceId}"
holder.tvDeviceType.text = "设备类型: ${device.deviceType}"
holder.tvLocation.text = "位置: ${device.location}"
holder.tvStatus.text = "状态: ${device.status}"
// 根据设备状态设置不同颜色
val statusColor = when (device.status) {
"正常" -> R.color.status_normal
"故障" -> R.color.status_fault
"维护中" -> R.color.status_maintenance
"报废" -> R.color.status_scrapped
else -> R.color.status_normal
}
holder.tvStatus.setTextColor(ContextCompat.getColor(context, statusColor))
// 设置点击事件 - 确保正确传递完整的设备对象
holder.cardView.setOnClickListener {
onItemClick(device)
}
}
override fun getItemCount() = devices.size
}
package com.example.sanpaias.entity
import android.os.Parcel
import android.os.Parcelable
data class Device(
val deviceId: String,
val deviceType: String,
val location: String,
val status: String
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString() ?: "",
parcel.readString() ?: "",
parcel.readString() ?: "",
parcel.readString() ?: ""
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(deviceId)
parcel.writeString(deviceType)
parcel.writeString(location)
parcel.writeString(status)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Device> {
override fun createFromParcel(parcel: Parcel): Device {
return Device(parcel)
}
override fun newArray(size: Int): Array<Device?> {
return arrayOfNulls(size)
}
}
}
package com.example.sanpaias.activity
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.example.sanpaias.R
import com.example.sanpaias.adapter.DeviceAdapter
import com.example.sanpaias.entity.Device
import com.example.sanpaias.network.RetrofitClient
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class DeviceListActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var swipeRefreshLayout: SwipeRefreshLayout
private lateinit var deviceAdapter: DeviceAdapter
private var deviceList = mutableListOf<Device>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_device_list)
// 设置返回按钮
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = "设备列表"
// 初始化视图
recyclerView = findViewById(R.id.recyclerView)
swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout)
// 设置RecyclerView
recyclerView.layoutManager = LinearLayoutManager(this)
deviceAdapter = DeviceAdapter(this, deviceList) { device ->
// 点击设备项时跳转到故障报修页面
if (device.status == "正常") {
val intent = Intent(this, DeviceFaultReportActivity::class.java)
// 确保正确传递设备对象
intent.putExtra("device", device)
startActivity(intent)
} else {
Toast.makeText(this, "该设备当前状态为${device.status},无法报修", Toast.LENGTH_SHORT).show()
}
}
recyclerView.adapter = deviceAdapter
// 设置下拉刷新
swipeRefreshLayout.setOnRefreshListener {
loadDevices()
}
// 加载设备数据
loadDevices()
}
private fun loadDevices() {
swipeRefreshLayout.isRefreshing = true
CoroutineScope(Dispatchers.Main).launch {
try {
val response = withContext(Dispatchers.IO) {
RetrofitClient.instance.getAllDevices()
}
if (response.isSuccessful && response.body()?.code == 200) {
val devices = response.body()?.data ?: emptyList()
deviceList.clear()
deviceList.addAll(devices)
deviceAdapter.notifyDataSetChanged()
// 处理空列表情况
if (devices.isEmpty()) {
findViewById<View>(R.id.tvEmpty).visibility = View.VISIBLE
} else {
findViewById<View>(R.id.tvEmpty).visibility = View.GONE
}
} else {
Toast.makeText(this@DeviceListActivity,
"获取设备列表失败: ${response.body()?.msg ?: "未知错误"}",
Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this@DeviceListActivity,
"网络错误,请稍后重试",
Toast.LENGTH_SHORT).show()
} finally {
swipeRefreshLayout.isRefreshing = false
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
return true
}
return super.onOptionsItemSelected(item)
}
override fun onResume() {
super.onResume()
// 页面恢复时刷新数据
loadDevices()
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.DeviceListActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="设备列表" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:padding="8dp" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvEmpty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂无设备数据"
android:textSize="16sp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tvDeviceId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="设备编号: FIRE001"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvDeviceType"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="设备类型: 消防喷淋系统" />
<TextView
android:id="@+id/tvLocation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="设备位置: B1层消防通道" />
<TextView
android:id="@+id/tvStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="状态: 正常"
android:textStyle="bold" />
</LinearLayout>
</androidx.cardview.widget.CardView>

浙公网安备 33010602011771号