diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index 07f1c2a..52c1f06 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -1,11 +1,12 @@ package com.casic.smarttube.adapter import android.content.Context +import android.graphics.Color import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.amap.api.services.core.LatLonPoint import com.amap.api.services.geocoder.GeocodeResult @@ -16,30 +17,55 @@ import com.casic.smarttube.extensions.toBatteryImage import com.casic.smarttube.extensions.toTextColor import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeViewHolder import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton class DeviceListAdapter( private val context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val geocoderSearch by lazy { GeocodeSearch(context) } private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_device_rv, parent, false) - ) + private var deleteAction = QMUISwipeAction.ActionBuilder() + .icon(ContextCompat.getDrawable(context, R.drawable.ic_delete_white)) + .textSize(16f.dp2px(context)) + .textColor(Color.WHITE) + .paddingStartEnd(16f.dp2px(context)).text("删除") + .backgroundColor(Color.RED) + .build() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QMUISwipeViewHolder { + val view = layoutInflater.inflate(R.layout.item_device_rv, parent, false) + val swipeViewHolder = QMUISwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + return swipeViewHolder } override fun getItemCount(): Int = dataRows.size - override fun onBindViewHolder(holder: DeviceListAdapter.ItemViewHolder, position: Int) { + override fun onBindViewHolder(holder: QMUISwipeViewHolder, position: Int) { + //初始化控件 + val batteryView: ImageView = holder.itemView.findViewById(R.id.batteryView) + val deviceCodeView: TextView = holder.itemView.findViewById(R.id.deviceCodeView) + val locationView: TextView = holder.itemView.findViewById(R.id.locationView) + val batteryDataView: TextView = holder.itemView.findViewById(R.id.batteryDataView) + val snrDataView: TextView = holder.itemView.findViewById(R.id.snrDataView) + val pciDataView: TextView = holder.itemView.findViewById(R.id.pciDataView) + val rsrpDataView: TextView = holder.itemView.findViewById(R.id.rsrpDataView) + val strengthDataView: TextView = holder.itemView.findViewById(R.id.strengthDataView) + val installDateView: TextView = holder.itemView.findViewById(R.id.installDateView) + val dataHistoryButton: QMUIRoundButton = + holder.itemView.findViewById(R.id.dataHistoryButton) + //绑定数据 val rowsBean = dataRows[position] - holder.batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) - holder.deviceCodeView.text = rowsBean.devcode + batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) + deviceCodeView.text = rowsBean.devcode if (rowsBean.latGaode.isBlank() || rowsBean.lngGaode.isBlank()) { - holder.locationView.text = "经纬度异常,无法查看具体位置" + locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(rowsBean.latGaode.toDouble(), rowsBean.lngGaode.toDouble()), @@ -51,7 +77,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - holder.locationView.text = + locationView.text = String.format("管盯位置:${result?.regeocodeAddress?.formatAddress}") } } @@ -61,42 +87,29 @@ } }) } - holder.batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { + batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { "0%" } else { rowsBean.cell + "%" } - holder.batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) - holder.snrDataView.text = rowsBean.snr - holder.pciDataView.text = rowsBean.pci - holder.rsrpDataView.text = rowsBean.rsrp - holder.strengthDataView.text = rowsBean.strength - holder.installDateView.text = String.format("更新时间:${rowsBean.installDate}") + batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) + snrDataView.text = rowsBean.snr + pciDataView.text = rowsBean.pci + rsrpDataView.text = rowsBean.rsrp + strengthDataView.text = rowsBean.strength + installDateView.text = String.format("更新时间:${rowsBean.installDate}") if (listener != null) { holder.itemView.setOnClickListener { listener!!.onClicked(position) } - holder.dataHistoryButton.setOnClickListener { + dataHistoryButton.setOnClickListener { listener!!.onHistoryClicked(position) } } } - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var batteryView: ImageView = view.findViewById(R.id.batteryView) - var deviceCodeView: TextView = view.findViewById(R.id.deviceCodeView) - var locationView: TextView = view.findViewById(R.id.locationView) - var batteryDataView: TextView = view.findViewById(R.id.batteryDataView) - var snrDataView: TextView = view.findViewById(R.id.snrDataView) - var pciDataView: TextView = view.findViewById(R.id.pciDataView) - var rsrpDataView: TextView = view.findViewById(R.id.rsrpDataView) - var strengthDataView: TextView = view.findViewById(R.id.strengthDataView) - var installDateView: TextView = view.findViewById(R.id.installDateView) - var dataHistoryButton: QMUIRoundButton = view.findViewById(R.id.dataHistoryButton) - } - private var listener: OnItemClickListener? = null interface OnItemClickListener { diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index 07f1c2a..52c1f06 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -1,11 +1,12 @@ package com.casic.smarttube.adapter import android.content.Context +import android.graphics.Color import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.amap.api.services.core.LatLonPoint import com.amap.api.services.geocoder.GeocodeResult @@ -16,30 +17,55 @@ import com.casic.smarttube.extensions.toBatteryImage import com.casic.smarttube.extensions.toTextColor import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeViewHolder import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton class DeviceListAdapter( private val context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val geocoderSearch by lazy { GeocodeSearch(context) } private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_device_rv, parent, false) - ) + private var deleteAction = QMUISwipeAction.ActionBuilder() + .icon(ContextCompat.getDrawable(context, R.drawable.ic_delete_white)) + .textSize(16f.dp2px(context)) + .textColor(Color.WHITE) + .paddingStartEnd(16f.dp2px(context)).text("删除") + .backgroundColor(Color.RED) + .build() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QMUISwipeViewHolder { + val view = layoutInflater.inflate(R.layout.item_device_rv, parent, false) + val swipeViewHolder = QMUISwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + return swipeViewHolder } override fun getItemCount(): Int = dataRows.size - override fun onBindViewHolder(holder: DeviceListAdapter.ItemViewHolder, position: Int) { + override fun onBindViewHolder(holder: QMUISwipeViewHolder, position: Int) { + //初始化控件 + val batteryView: ImageView = holder.itemView.findViewById(R.id.batteryView) + val deviceCodeView: TextView = holder.itemView.findViewById(R.id.deviceCodeView) + val locationView: TextView = holder.itemView.findViewById(R.id.locationView) + val batteryDataView: TextView = holder.itemView.findViewById(R.id.batteryDataView) + val snrDataView: TextView = holder.itemView.findViewById(R.id.snrDataView) + val pciDataView: TextView = holder.itemView.findViewById(R.id.pciDataView) + val rsrpDataView: TextView = holder.itemView.findViewById(R.id.rsrpDataView) + val strengthDataView: TextView = holder.itemView.findViewById(R.id.strengthDataView) + val installDateView: TextView = holder.itemView.findViewById(R.id.installDateView) + val dataHistoryButton: QMUIRoundButton = + holder.itemView.findViewById(R.id.dataHistoryButton) + //绑定数据 val rowsBean = dataRows[position] - holder.batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) - holder.deviceCodeView.text = rowsBean.devcode + batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) + deviceCodeView.text = rowsBean.devcode if (rowsBean.latGaode.isBlank() || rowsBean.lngGaode.isBlank()) { - holder.locationView.text = "经纬度异常,无法查看具体位置" + locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(rowsBean.latGaode.toDouble(), rowsBean.lngGaode.toDouble()), @@ -51,7 +77,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - holder.locationView.text = + locationView.text = String.format("管盯位置:${result?.regeocodeAddress?.formatAddress}") } } @@ -61,42 +87,29 @@ } }) } - holder.batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { + batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { "0%" } else { rowsBean.cell + "%" } - holder.batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) - holder.snrDataView.text = rowsBean.snr - holder.pciDataView.text = rowsBean.pci - holder.rsrpDataView.text = rowsBean.rsrp - holder.strengthDataView.text = rowsBean.strength - holder.installDateView.text = String.format("更新时间:${rowsBean.installDate}") + batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) + snrDataView.text = rowsBean.snr + pciDataView.text = rowsBean.pci + rsrpDataView.text = rowsBean.rsrp + strengthDataView.text = rowsBean.strength + installDateView.text = String.format("更新时间:${rowsBean.installDate}") if (listener != null) { holder.itemView.setOnClickListener { listener!!.onClicked(position) } - holder.dataHistoryButton.setOnClickListener { + dataHistoryButton.setOnClickListener { listener!!.onHistoryClicked(position) } } } - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var batteryView: ImageView = view.findViewById(R.id.batteryView) - var deviceCodeView: TextView = view.findViewById(R.id.deviceCodeView) - var locationView: TextView = view.findViewById(R.id.locationView) - var batteryDataView: TextView = view.findViewById(R.id.batteryDataView) - var snrDataView: TextView = view.findViewById(R.id.snrDataView) - var pciDataView: TextView = view.findViewById(R.id.pciDataView) - var rsrpDataView: TextView = view.findViewById(R.id.rsrpDataView) - var strengthDataView: TextView = view.findViewById(R.id.strengthDataView) - var installDateView: TextView = view.findViewById(R.id.installDateView) - var dataHistoryButton: QMUIRoundButton = view.findViewById(R.id.dataHistoryButton) - } - private var listener: OnItemClickListener? = null interface OnItemClickListener { diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt index c0343d8..5834f21 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt @@ -211,4 +211,13 @@ @Query("oldGroupName") oldGroupId: String, @Query("newGroupName") newGroupId: String ): String + + /** + * 删除设备 + * */ + @POST("/tube/batch/delete") + suspend fun deleteDeviceById( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index 07f1c2a..52c1f06 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -1,11 +1,12 @@ package com.casic.smarttube.adapter import android.content.Context +import android.graphics.Color import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.amap.api.services.core.LatLonPoint import com.amap.api.services.geocoder.GeocodeResult @@ -16,30 +17,55 @@ import com.casic.smarttube.extensions.toBatteryImage import com.casic.smarttube.extensions.toTextColor import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeViewHolder import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton class DeviceListAdapter( private val context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val geocoderSearch by lazy { GeocodeSearch(context) } private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_device_rv, parent, false) - ) + private var deleteAction = QMUISwipeAction.ActionBuilder() + .icon(ContextCompat.getDrawable(context, R.drawable.ic_delete_white)) + .textSize(16f.dp2px(context)) + .textColor(Color.WHITE) + .paddingStartEnd(16f.dp2px(context)).text("删除") + .backgroundColor(Color.RED) + .build() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QMUISwipeViewHolder { + val view = layoutInflater.inflate(R.layout.item_device_rv, parent, false) + val swipeViewHolder = QMUISwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + return swipeViewHolder } override fun getItemCount(): Int = dataRows.size - override fun onBindViewHolder(holder: DeviceListAdapter.ItemViewHolder, position: Int) { + override fun onBindViewHolder(holder: QMUISwipeViewHolder, position: Int) { + //初始化控件 + val batteryView: ImageView = holder.itemView.findViewById(R.id.batteryView) + val deviceCodeView: TextView = holder.itemView.findViewById(R.id.deviceCodeView) + val locationView: TextView = holder.itemView.findViewById(R.id.locationView) + val batteryDataView: TextView = holder.itemView.findViewById(R.id.batteryDataView) + val snrDataView: TextView = holder.itemView.findViewById(R.id.snrDataView) + val pciDataView: TextView = holder.itemView.findViewById(R.id.pciDataView) + val rsrpDataView: TextView = holder.itemView.findViewById(R.id.rsrpDataView) + val strengthDataView: TextView = holder.itemView.findViewById(R.id.strengthDataView) + val installDateView: TextView = holder.itemView.findViewById(R.id.installDateView) + val dataHistoryButton: QMUIRoundButton = + holder.itemView.findViewById(R.id.dataHistoryButton) + //绑定数据 val rowsBean = dataRows[position] - holder.batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) - holder.deviceCodeView.text = rowsBean.devcode + batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) + deviceCodeView.text = rowsBean.devcode if (rowsBean.latGaode.isBlank() || rowsBean.lngGaode.isBlank()) { - holder.locationView.text = "经纬度异常,无法查看具体位置" + locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(rowsBean.latGaode.toDouble(), rowsBean.lngGaode.toDouble()), @@ -51,7 +77,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - holder.locationView.text = + locationView.text = String.format("管盯位置:${result?.regeocodeAddress?.formatAddress}") } } @@ -61,42 +87,29 @@ } }) } - holder.batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { + batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { "0%" } else { rowsBean.cell + "%" } - holder.batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) - holder.snrDataView.text = rowsBean.snr - holder.pciDataView.text = rowsBean.pci - holder.rsrpDataView.text = rowsBean.rsrp - holder.strengthDataView.text = rowsBean.strength - holder.installDateView.text = String.format("更新时间:${rowsBean.installDate}") + batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) + snrDataView.text = rowsBean.snr + pciDataView.text = rowsBean.pci + rsrpDataView.text = rowsBean.rsrp + strengthDataView.text = rowsBean.strength + installDateView.text = String.format("更新时间:${rowsBean.installDate}") if (listener != null) { holder.itemView.setOnClickListener { listener!!.onClicked(position) } - holder.dataHistoryButton.setOnClickListener { + dataHistoryButton.setOnClickListener { listener!!.onHistoryClicked(position) } } } - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var batteryView: ImageView = view.findViewById(R.id.batteryView) - var deviceCodeView: TextView = view.findViewById(R.id.deviceCodeView) - var locationView: TextView = view.findViewById(R.id.locationView) - var batteryDataView: TextView = view.findViewById(R.id.batteryDataView) - var snrDataView: TextView = view.findViewById(R.id.snrDataView) - var pciDataView: TextView = view.findViewById(R.id.pciDataView) - var rsrpDataView: TextView = view.findViewById(R.id.rsrpDataView) - var strengthDataView: TextView = view.findViewById(R.id.strengthDataView) - var installDateView: TextView = view.findViewById(R.id.installDateView) - var dataHistoryButton: QMUIRoundButton = view.findViewById(R.id.dataHistoryButton) - } - private var listener: OnItemClickListener? = null interface OnItemClickListener { diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt index c0343d8..5834f21 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt @@ -211,4 +211,13 @@ @Query("oldGroupName") oldGroupId: String, @Query("newGroupName") newGroupId: String ): String + + /** + * 删除设备 + * */ + @POST("/tube/batch/delete") + suspend fun deleteDeviceById( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt index 4814a1f..3258f72 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt @@ -204,4 +204,14 @@ suspend fun changeGroupId(oldGroupId: String, newGroupId: String): String { return api.changeGroupId(AuthenticationHelper.token!!, oldGroupId, newGroupId) } + + /** + * 删除设备 + */ + suspend fun deleteDeviceById(ids: List): String { + val requestBody = ids.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.deleteDeviceById(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index 07f1c2a..52c1f06 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -1,11 +1,12 @@ package com.casic.smarttube.adapter import android.content.Context +import android.graphics.Color import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.amap.api.services.core.LatLonPoint import com.amap.api.services.geocoder.GeocodeResult @@ -16,30 +17,55 @@ import com.casic.smarttube.extensions.toBatteryImage import com.casic.smarttube.extensions.toTextColor import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeViewHolder import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton class DeviceListAdapter( private val context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val geocoderSearch by lazy { GeocodeSearch(context) } private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_device_rv, parent, false) - ) + private var deleteAction = QMUISwipeAction.ActionBuilder() + .icon(ContextCompat.getDrawable(context, R.drawable.ic_delete_white)) + .textSize(16f.dp2px(context)) + .textColor(Color.WHITE) + .paddingStartEnd(16f.dp2px(context)).text("删除") + .backgroundColor(Color.RED) + .build() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QMUISwipeViewHolder { + val view = layoutInflater.inflate(R.layout.item_device_rv, parent, false) + val swipeViewHolder = QMUISwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + return swipeViewHolder } override fun getItemCount(): Int = dataRows.size - override fun onBindViewHolder(holder: DeviceListAdapter.ItemViewHolder, position: Int) { + override fun onBindViewHolder(holder: QMUISwipeViewHolder, position: Int) { + //初始化控件 + val batteryView: ImageView = holder.itemView.findViewById(R.id.batteryView) + val deviceCodeView: TextView = holder.itemView.findViewById(R.id.deviceCodeView) + val locationView: TextView = holder.itemView.findViewById(R.id.locationView) + val batteryDataView: TextView = holder.itemView.findViewById(R.id.batteryDataView) + val snrDataView: TextView = holder.itemView.findViewById(R.id.snrDataView) + val pciDataView: TextView = holder.itemView.findViewById(R.id.pciDataView) + val rsrpDataView: TextView = holder.itemView.findViewById(R.id.rsrpDataView) + val strengthDataView: TextView = holder.itemView.findViewById(R.id.strengthDataView) + val installDateView: TextView = holder.itemView.findViewById(R.id.installDateView) + val dataHistoryButton: QMUIRoundButton = + holder.itemView.findViewById(R.id.dataHistoryButton) + //绑定数据 val rowsBean = dataRows[position] - holder.batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) - holder.deviceCodeView.text = rowsBean.devcode + batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) + deviceCodeView.text = rowsBean.devcode if (rowsBean.latGaode.isBlank() || rowsBean.lngGaode.isBlank()) { - holder.locationView.text = "经纬度异常,无法查看具体位置" + locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(rowsBean.latGaode.toDouble(), rowsBean.lngGaode.toDouble()), @@ -51,7 +77,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - holder.locationView.text = + locationView.text = String.format("管盯位置:${result?.regeocodeAddress?.formatAddress}") } } @@ -61,42 +87,29 @@ } }) } - holder.batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { + batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { "0%" } else { rowsBean.cell + "%" } - holder.batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) - holder.snrDataView.text = rowsBean.snr - holder.pciDataView.text = rowsBean.pci - holder.rsrpDataView.text = rowsBean.rsrp - holder.strengthDataView.text = rowsBean.strength - holder.installDateView.text = String.format("更新时间:${rowsBean.installDate}") + batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) + snrDataView.text = rowsBean.snr + pciDataView.text = rowsBean.pci + rsrpDataView.text = rowsBean.rsrp + strengthDataView.text = rowsBean.strength + installDateView.text = String.format("更新时间:${rowsBean.installDate}") if (listener != null) { holder.itemView.setOnClickListener { listener!!.onClicked(position) } - holder.dataHistoryButton.setOnClickListener { + dataHistoryButton.setOnClickListener { listener!!.onHistoryClicked(position) } } } - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var batteryView: ImageView = view.findViewById(R.id.batteryView) - var deviceCodeView: TextView = view.findViewById(R.id.deviceCodeView) - var locationView: TextView = view.findViewById(R.id.locationView) - var batteryDataView: TextView = view.findViewById(R.id.batteryDataView) - var snrDataView: TextView = view.findViewById(R.id.snrDataView) - var pciDataView: TextView = view.findViewById(R.id.pciDataView) - var rsrpDataView: TextView = view.findViewById(R.id.rsrpDataView) - var strengthDataView: TextView = view.findViewById(R.id.strengthDataView) - var installDateView: TextView = view.findViewById(R.id.installDateView) - var dataHistoryButton: QMUIRoundButton = view.findViewById(R.id.dataHistoryButton) - } - private var listener: OnItemClickListener? = null interface OnItemClickListener { diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt index c0343d8..5834f21 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt @@ -211,4 +211,13 @@ @Query("oldGroupName") oldGroupId: String, @Query("newGroupName") newGroupId: String ): String + + /** + * 删除设备 + * */ + @POST("/tube/batch/delete") + suspend fun deleteDeviceById( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt index 4814a1f..3258f72 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt @@ -204,4 +204,14 @@ suspend fun changeGroupId(oldGroupId: String, newGroupId: String): String { return api.changeGroupId(AuthenticationHelper.token!!, oldGroupId, newGroupId) } + + /** + * 删除设备 + */ + suspend fun deleteDeviceById(ids: List): String { + val requestBody = ids.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.deleteDeviceById(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 94de959..d4e080b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,13 +1,16 @@ package com.casic.smarttube.view import android.os.Handler +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.DialogManager +import com.casic.smarttube.vm.DeviceViewModel import com.casic.smarttube.vm.ProjectGroupViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -18,6 +21,9 @@ import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction import kotlinx.android.synthetic.main.activity_group_device.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -27,12 +33,14 @@ private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var groupViewModel: ProjectGroupViewModel + private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 + private var clickedPosition = 0 override fun initLayoutView(): Int = R.layout.activity_group_device @@ -57,6 +65,7 @@ dialogManager = DialogManager.obtainInstance(this) weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) + deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) obtainDeviceListByPage() } @@ -105,6 +114,16 @@ else -> dialogManager.dismissLoadingDialog() } }) + + deviceViewModel.deleteResult.observe(this, { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + }) } private fun obtainDeviceListByPage() { @@ -124,8 +143,18 @@ } else { emptyView!!.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) - groupDeviceView!!.layoutManager = LinearLayoutManager(this) - groupDeviceView!!.adapter = deviceAdapter + //绑定侧滑事件 + swipeAction.attachToRecyclerView(groupDeviceView) + val linearLayoutManager = object : LinearLayoutManager(this) { + override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { + return RecyclerView.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + } + groupDeviceView.layoutManager = linearLayoutManager + groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -153,4 +182,78 @@ } true } + + private val swipeAction = + QMUIRVItemSwipeAction(true, object : QMUIRVItemSwipeAction.Callback() { + + //滑动拉出菜单删除 + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + clickedPosition = viewHolder.bindingAdapterPosition + //删除数据库里对应的数据 + deviceViewModel.deleteDeviceById(arrayListOf(dataBeans[clickedPosition].tubeId.toLong())) + + //刷新列表 + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeRemoved( + clickedPosition, dataBeans.size - clickedPosition + ) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } + } + + override fun getSwipeDirection( + recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder + ): Int { + return QMUIRVItemSwipeAction.SWIPE_LEFT + } + + //滑动拉出菜单,点击删除 + override fun onClickAction( + swipeAction: QMUIRVItemSwipeAction?, + selected: RecyclerView.ViewHolder?, + action: QMUISwipeAction? + ) { + super.onClickAction(swipeAction, selected, action) + deleteItem(selected!!.bindingAdapterPosition) + } + }) + + private fun deleteItem(adapterPosition: Int) { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?") + .setNegativeButton("容我想想") + .setPositiveButton("已经想好") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + clickedPosition = adapterPosition + //删除数据库里对应的数据 + deviceViewModel.deleteDeviceById(arrayListOf(dataBeans[clickedPosition].tubeId.toLong())) + + //刷新列表 + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeRemoved( + clickedPosition, dataBeans.size - clickedPosition + ) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } + } + }).build().show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index 07f1c2a..52c1f06 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -1,11 +1,12 @@ package com.casic.smarttube.adapter import android.content.Context +import android.graphics.Color import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.amap.api.services.core.LatLonPoint import com.amap.api.services.geocoder.GeocodeResult @@ -16,30 +17,55 @@ import com.casic.smarttube.extensions.toBatteryImage import com.casic.smarttube.extensions.toTextColor import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeViewHolder import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton class DeviceListAdapter( private val context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val geocoderSearch by lazy { GeocodeSearch(context) } private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_device_rv, parent, false) - ) + private var deleteAction = QMUISwipeAction.ActionBuilder() + .icon(ContextCompat.getDrawable(context, R.drawable.ic_delete_white)) + .textSize(16f.dp2px(context)) + .textColor(Color.WHITE) + .paddingStartEnd(16f.dp2px(context)).text("删除") + .backgroundColor(Color.RED) + .build() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QMUISwipeViewHolder { + val view = layoutInflater.inflate(R.layout.item_device_rv, parent, false) + val swipeViewHolder = QMUISwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + return swipeViewHolder } override fun getItemCount(): Int = dataRows.size - override fun onBindViewHolder(holder: DeviceListAdapter.ItemViewHolder, position: Int) { + override fun onBindViewHolder(holder: QMUISwipeViewHolder, position: Int) { + //初始化控件 + val batteryView: ImageView = holder.itemView.findViewById(R.id.batteryView) + val deviceCodeView: TextView = holder.itemView.findViewById(R.id.deviceCodeView) + val locationView: TextView = holder.itemView.findViewById(R.id.locationView) + val batteryDataView: TextView = holder.itemView.findViewById(R.id.batteryDataView) + val snrDataView: TextView = holder.itemView.findViewById(R.id.snrDataView) + val pciDataView: TextView = holder.itemView.findViewById(R.id.pciDataView) + val rsrpDataView: TextView = holder.itemView.findViewById(R.id.rsrpDataView) + val strengthDataView: TextView = holder.itemView.findViewById(R.id.strengthDataView) + val installDateView: TextView = holder.itemView.findViewById(R.id.installDateView) + val dataHistoryButton: QMUIRoundButton = + holder.itemView.findViewById(R.id.dataHistoryButton) + //绑定数据 val rowsBean = dataRows[position] - holder.batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) - holder.deviceCodeView.text = rowsBean.devcode + batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) + deviceCodeView.text = rowsBean.devcode if (rowsBean.latGaode.isBlank() || rowsBean.lngGaode.isBlank()) { - holder.locationView.text = "经纬度异常,无法查看具体位置" + locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(rowsBean.latGaode.toDouble(), rowsBean.lngGaode.toDouble()), @@ -51,7 +77,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - holder.locationView.text = + locationView.text = String.format("管盯位置:${result?.regeocodeAddress?.formatAddress}") } } @@ -61,42 +87,29 @@ } }) } - holder.batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { + batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { "0%" } else { rowsBean.cell + "%" } - holder.batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) - holder.snrDataView.text = rowsBean.snr - holder.pciDataView.text = rowsBean.pci - holder.rsrpDataView.text = rowsBean.rsrp - holder.strengthDataView.text = rowsBean.strength - holder.installDateView.text = String.format("更新时间:${rowsBean.installDate}") + batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) + snrDataView.text = rowsBean.snr + pciDataView.text = rowsBean.pci + rsrpDataView.text = rowsBean.rsrp + strengthDataView.text = rowsBean.strength + installDateView.text = String.format("更新时间:${rowsBean.installDate}") if (listener != null) { holder.itemView.setOnClickListener { listener!!.onClicked(position) } - holder.dataHistoryButton.setOnClickListener { + dataHistoryButton.setOnClickListener { listener!!.onHistoryClicked(position) } } } - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var batteryView: ImageView = view.findViewById(R.id.batteryView) - var deviceCodeView: TextView = view.findViewById(R.id.deviceCodeView) - var locationView: TextView = view.findViewById(R.id.locationView) - var batteryDataView: TextView = view.findViewById(R.id.batteryDataView) - var snrDataView: TextView = view.findViewById(R.id.snrDataView) - var pciDataView: TextView = view.findViewById(R.id.pciDataView) - var rsrpDataView: TextView = view.findViewById(R.id.rsrpDataView) - var strengthDataView: TextView = view.findViewById(R.id.strengthDataView) - var installDateView: TextView = view.findViewById(R.id.installDateView) - var dataHistoryButton: QMUIRoundButton = view.findViewById(R.id.dataHistoryButton) - } - private var listener: OnItemClickListener? = null interface OnItemClickListener { diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt index c0343d8..5834f21 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt @@ -211,4 +211,13 @@ @Query("oldGroupName") oldGroupId: String, @Query("newGroupName") newGroupId: String ): String + + /** + * 删除设备 + * */ + @POST("/tube/batch/delete") + suspend fun deleteDeviceById( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt index 4814a1f..3258f72 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt @@ -204,4 +204,14 @@ suspend fun changeGroupId(oldGroupId: String, newGroupId: String): String { return api.changeGroupId(AuthenticationHelper.token!!, oldGroupId, newGroupId) } + + /** + * 删除设备 + */ + suspend fun deleteDeviceById(ids: List): String { + val requestBody = ids.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.deleteDeviceById(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 94de959..d4e080b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,13 +1,16 @@ package com.casic.smarttube.view import android.os.Handler +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.DialogManager +import com.casic.smarttube.vm.DeviceViewModel import com.casic.smarttube.vm.ProjectGroupViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -18,6 +21,9 @@ import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction import kotlinx.android.synthetic.main.activity_group_device.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -27,12 +33,14 @@ private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var groupViewModel: ProjectGroupViewModel + private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 + private var clickedPosition = 0 override fun initLayoutView(): Int = R.layout.activity_group_device @@ -57,6 +65,7 @@ dialogManager = DialogManager.obtainInstance(this) weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) + deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) obtainDeviceListByPage() } @@ -105,6 +114,16 @@ else -> dialogManager.dismissLoadingDialog() } }) + + deviceViewModel.deleteResult.observe(this, { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + }) } private fun obtainDeviceListByPage() { @@ -124,8 +143,18 @@ } else { emptyView!!.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) - groupDeviceView!!.layoutManager = LinearLayoutManager(this) - groupDeviceView!!.adapter = deviceAdapter + //绑定侧滑事件 + swipeAction.attachToRecyclerView(groupDeviceView) + val linearLayoutManager = object : LinearLayoutManager(this) { + override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { + return RecyclerView.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + } + groupDeviceView.layoutManager = linearLayoutManager + groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -153,4 +182,78 @@ } true } + + private val swipeAction = + QMUIRVItemSwipeAction(true, object : QMUIRVItemSwipeAction.Callback() { + + //滑动拉出菜单删除 + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + clickedPosition = viewHolder.bindingAdapterPosition + //删除数据库里对应的数据 + deviceViewModel.deleteDeviceById(arrayListOf(dataBeans[clickedPosition].tubeId.toLong())) + + //刷新列表 + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeRemoved( + clickedPosition, dataBeans.size - clickedPosition + ) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } + } + + override fun getSwipeDirection( + recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder + ): Int { + return QMUIRVItemSwipeAction.SWIPE_LEFT + } + + //滑动拉出菜单,点击删除 + override fun onClickAction( + swipeAction: QMUIRVItemSwipeAction?, + selected: RecyclerView.ViewHolder?, + action: QMUISwipeAction? + ) { + super.onClickAction(swipeAction, selected, action) + deleteItem(selected!!.bindingAdapterPosition) + } + }) + + private fun deleteItem(adapterPosition: Int) { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?") + .setNegativeButton("容我想想") + .setPositiveButton("已经想好") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + clickedPosition = adapterPosition + //删除数据库里对应的数据 + deviceViewModel.deleteDeviceById(arrayListOf(dataBeans[clickedPosition].tubeId.toLong())) + + //刷新列表 + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeRemoved( + clickedPosition, dataBeans.size - clickedPosition + ) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } + } + }).build().show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt index e3d4c62..116879a 100644 --- a/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt @@ -4,10 +4,7 @@ import com.casic.smarttube.base.BaseApplication import com.casic.smarttube.extensions.separateResponseCode import com.casic.smarttube.extensions.toErrorMessage -import com.casic.smarttube.model.DeviceDetailModel -import com.casic.smarttube.model.DeviceHistoryDataModel -import com.casic.smarttube.model.LastDataModel -import com.casic.smarttube.model.MapDeviceModel +import com.casic.smarttube.model.* import com.casic.smarttube.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -23,6 +20,7 @@ val deviceDetailModel = MutableLiveData() val historyDataModel = MutableLiveData() val lastDataModel = MutableLiveData() + val deleteResult = MutableLiveData() fun obtainMapDeviceList() = launch({ val response = RetrofitServiceManager.obtainMapDeviceList() @@ -131,4 +129,18 @@ }, { it.printStackTrace() }) + + fun deleteDeviceById(ids: List) = launch({ + val response = RetrofitServiceManager.deleteDeviceById(ids) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deleteResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index 07f1c2a..52c1f06 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -1,11 +1,12 @@ package com.casic.smarttube.adapter import android.content.Context +import android.graphics.Color import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.amap.api.services.core.LatLonPoint import com.amap.api.services.geocoder.GeocodeResult @@ -16,30 +17,55 @@ import com.casic.smarttube.extensions.toBatteryImage import com.casic.smarttube.extensions.toTextColor import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeViewHolder import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton class DeviceListAdapter( private val context: Context, private val dataRows: MutableList -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val geocoderSearch by lazy { GeocodeSearch(context) } private val layoutInflater: LayoutInflater = LayoutInflater.from(context) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - return ItemViewHolder( - layoutInflater.inflate(R.layout.item_device_rv, parent, false) - ) + private var deleteAction = QMUISwipeAction.ActionBuilder() + .icon(ContextCompat.getDrawable(context, R.drawable.ic_delete_white)) + .textSize(16f.dp2px(context)) + .textColor(Color.WHITE) + .paddingStartEnd(16f.dp2px(context)).text("删除") + .backgroundColor(Color.RED) + .build() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QMUISwipeViewHolder { + val view = layoutInflater.inflate(R.layout.item_device_rv, parent, false) + val swipeViewHolder = QMUISwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + return swipeViewHolder } override fun getItemCount(): Int = dataRows.size - override fun onBindViewHolder(holder: DeviceListAdapter.ItemViewHolder, position: Int) { + override fun onBindViewHolder(holder: QMUISwipeViewHolder, position: Int) { + //初始化控件 + val batteryView: ImageView = holder.itemView.findViewById(R.id.batteryView) + val deviceCodeView: TextView = holder.itemView.findViewById(R.id.deviceCodeView) + val locationView: TextView = holder.itemView.findViewById(R.id.locationView) + val batteryDataView: TextView = holder.itemView.findViewById(R.id.batteryDataView) + val snrDataView: TextView = holder.itemView.findViewById(R.id.snrDataView) + val pciDataView: TextView = holder.itemView.findViewById(R.id.pciDataView) + val rsrpDataView: TextView = holder.itemView.findViewById(R.id.rsrpDataView) + val strengthDataView: TextView = holder.itemView.findViewById(R.id.strengthDataView) + val installDateView: TextView = holder.itemView.findViewById(R.id.installDateView) + val dataHistoryButton: QMUIRoundButton = + holder.itemView.findViewById(R.id.dataHistoryButton) + //绑定数据 val rowsBean = dataRows[position] - holder.batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) - holder.deviceCodeView.text = rowsBean.devcode + batteryView.setBackgroundResource(rowsBean.cell.toBatteryImage()) + deviceCodeView.text = rowsBean.devcode if (rowsBean.latGaode.isBlank() || rowsBean.lngGaode.isBlank()) { - holder.locationView.text = "经纬度异常,无法查看具体位置" + locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(rowsBean.latGaode.toDouble(), rowsBean.lngGaode.toDouble()), @@ -51,7 +77,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - holder.locationView.text = + locationView.text = String.format("管盯位置:${result?.regeocodeAddress?.formatAddress}") } } @@ -61,42 +87,29 @@ } }) } - holder.batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { + batteryDataView.text = if (rowsBean.cell.isNullOrBlank()) { "0%" } else { rowsBean.cell + "%" } - holder.batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) - holder.snrDataView.text = rowsBean.snr - holder.pciDataView.text = rowsBean.pci - holder.rsrpDataView.text = rowsBean.rsrp - holder.strengthDataView.text = rowsBean.strength - holder.installDateView.text = String.format("更新时间:${rowsBean.installDate}") + batteryDataView.setTextColor(rowsBean.cell.toTextColor(context)) + snrDataView.text = rowsBean.snr + pciDataView.text = rowsBean.pci + rsrpDataView.text = rowsBean.rsrp + strengthDataView.text = rowsBean.strength + installDateView.text = String.format("更新时间:${rowsBean.installDate}") if (listener != null) { holder.itemView.setOnClickListener { listener!!.onClicked(position) } - holder.dataHistoryButton.setOnClickListener { + dataHistoryButton.setOnClickListener { listener!!.onHistoryClicked(position) } } } - inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var batteryView: ImageView = view.findViewById(R.id.batteryView) - var deviceCodeView: TextView = view.findViewById(R.id.deviceCodeView) - var locationView: TextView = view.findViewById(R.id.locationView) - var batteryDataView: TextView = view.findViewById(R.id.batteryDataView) - var snrDataView: TextView = view.findViewById(R.id.snrDataView) - var pciDataView: TextView = view.findViewById(R.id.pciDataView) - var rsrpDataView: TextView = view.findViewById(R.id.rsrpDataView) - var strengthDataView: TextView = view.findViewById(R.id.strengthDataView) - var installDateView: TextView = view.findViewById(R.id.installDateView) - var dataHistoryButton: QMUIRoundButton = view.findViewById(R.id.dataHistoryButton) - } - private var listener: OnItemClickListener? = null interface OnItemClickListener { diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt index c0343d8..5834f21 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitService.kt @@ -211,4 +211,13 @@ @Query("oldGroupName") oldGroupId: String, @Query("newGroupName") newGroupId: String ): String + + /** + * 删除设备 + * */ + @POST("/tube/batch/delete") + suspend fun deleteDeviceById( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt index 4814a1f..3258f72 100644 --- a/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smarttube/utils/retrofit/RetrofitServiceManager.kt @@ -204,4 +204,14 @@ suspend fun changeGroupId(oldGroupId: String, newGroupId: String): String { return api.changeGroupId(AuthenticationHelper.token!!, oldGroupId, newGroupId) } + + /** + * 删除设备 + */ + suspend fun deleteDeviceById(ids: List): String { + val requestBody = ids.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.deleteDeviceById(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 94de959..d4e080b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,13 +1,16 @@ package com.casic.smarttube.view import android.os.Handler +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.DialogManager +import com.casic.smarttube.vm.DeviceViewModel import com.casic.smarttube.vm.ProjectGroupViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -18,6 +21,9 @@ import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction +import com.qmuiteam.qmui.recyclerView.QMUISwipeAction import kotlinx.android.synthetic.main.activity_group_device.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -27,12 +33,14 @@ private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var groupViewModel: ProjectGroupViewModel + private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 + private var clickedPosition = 0 override fun initLayoutView(): Int = R.layout.activity_group_device @@ -57,6 +65,7 @@ dialogManager = DialogManager.obtainInstance(this) weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) + deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) obtainDeviceListByPage() } @@ -105,6 +114,16 @@ else -> dialogManager.dismissLoadingDialog() } }) + + deviceViewModel.deleteResult.observe(this, { + if (it.code == 200) { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + }) } private fun obtainDeviceListByPage() { @@ -124,8 +143,18 @@ } else { emptyView!!.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) - groupDeviceView!!.layoutManager = LinearLayoutManager(this) - groupDeviceView!!.adapter = deviceAdapter + //绑定侧滑事件 + swipeAction.attachToRecyclerView(groupDeviceView) + val linearLayoutManager = object : LinearLayoutManager(this) { + override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { + return RecyclerView.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + } + groupDeviceView.layoutManager = linearLayoutManager + groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -153,4 +182,78 @@ } true } + + private val swipeAction = + QMUIRVItemSwipeAction(true, object : QMUIRVItemSwipeAction.Callback() { + + //滑动拉出菜单删除 + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + clickedPosition = viewHolder.bindingAdapterPosition + //删除数据库里对应的数据 + deviceViewModel.deleteDeviceById(arrayListOf(dataBeans[clickedPosition].tubeId.toLong())) + + //刷新列表 + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeRemoved( + clickedPosition, dataBeans.size - clickedPosition + ) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } + } + + override fun getSwipeDirection( + recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder + ): Int { + return QMUIRVItemSwipeAction.SWIPE_LEFT + } + + //滑动拉出菜单,点击删除 + override fun onClickAction( + swipeAction: QMUIRVItemSwipeAction?, + selected: RecyclerView.ViewHolder?, + action: QMUISwipeAction? + ) { + super.onClickAction(swipeAction, selected, action) + deleteItem(selected!!.bindingAdapterPosition) + } + }) + + private fun deleteItem(adapterPosition: Int) { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?") + .setNegativeButton("容我想想") + .setPositiveButton("已经想好") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + clickedPosition = adapterPosition + //删除数据库里对应的数据 + deviceViewModel.deleteDeviceById(arrayListOf(dataBeans[clickedPosition].tubeId.toLong())) + + //刷新列表 + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeRemoved( + clickedPosition, dataBeans.size - clickedPosition + ) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } + } + }).build().show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt index e3d4c62..116879a 100644 --- a/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smarttube/vm/DeviceViewModel.kt @@ -4,10 +4,7 @@ import com.casic.smarttube.base.BaseApplication import com.casic.smarttube.extensions.separateResponseCode import com.casic.smarttube.extensions.toErrorMessage -import com.casic.smarttube.model.DeviceDetailModel -import com.casic.smarttube.model.DeviceHistoryDataModel -import com.casic.smarttube.model.LastDataModel -import com.casic.smarttube.model.MapDeviceModel +import com.casic.smarttube.model.* import com.casic.smarttube.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -23,6 +20,7 @@ val deviceDetailModel = MutableLiveData() val historyDataModel = MutableLiveData() val lastDataModel = MutableLiveData() + val deleteResult = MutableLiveData() fun obtainMapDeviceList() = launch({ val response = RetrofitServiceManager.obtainMapDeviceList() @@ -131,4 +129,18 @@ }, { it.printStackTrace() }) + + fun deleteDeviceById(ids: List) = launch({ + val response = RetrofitServiceManager.deleteDeviceById(ids) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deleteResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete_white.xml b/app/src/main/res/drawable/ic_delete_white.xml new file mode 100644 index 0000000..40313ad --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_white.xml @@ -0,0 +1,12 @@ + + + +