From 0d99c4f22a8e3138c3957638c3d3897e629fa054 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Mon, 11 Aug 2025 14:22:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95=E9=80=9A=E8=BF=87=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=AE=BE=E5=A4=87=E4=BF=A1=E6=81=AF=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=8C=E7=BA=A7=E9=A1=B5=E9=9D=A2=E9=87=8D?= =?UTF-8?q?=E9=87=8F=EF=BC=8C=E9=A6=96=E9=A1=B5=E5=92=8C=E4=BA=8C=E7=BA=A7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=88=97=E8=A1=A8=E9=A1=B5=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../intelligent/shelves/HomeActivity.kt | 165 +++++++++++------- .../intelligent/shelves/ShelfActivity.kt | 100 ++++++----- .../intelligent/shelves/utils/DecToHex.kt | 46 +++++ .../intelligent/shelves/utils/UIUtils.kt | 14 -- .../res/drawable-xxxhdpi/ic_empty_gray.png | Bin 0 -> 7126 bytes .../res/drawable-xxxhdpi/ic_empty_white.png | Bin 0 -> 6199 bytes .../main/res/layout-sw360dp/activity_home.xml | 12 +- .../res/layout-sw360dp/activity_shelf.xml | 59 ++++--- .../res/layout-sw360dp/layout_empty_view.xml | 28 +++ .../res/layout-sw600dp/activity_shelf.xml | 2 +- .../res/layout-sw600dp/layout_empty_view.xml | 28 +++ 11 files changed, 312 insertions(+), 142 deletions(-) delete mode 100644 app/src/main/java/com/shuwei/intelligent/shelves/utils/UIUtils.kt create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_empty_gray.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_empty_white.png create mode 100644 app/src/main/res/layout-sw360dp/layout_empty_view.xml create mode 100644 app/src/main/res/layout-sw600dp/layout_empty_view.xml diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt index 90ff86b..48c079b 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt @@ -2,6 +2,7 @@ package com.shuwei.intelligent.shelves import android.annotation.SuppressLint import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.os.Handler import android.os.Looper @@ -12,6 +13,7 @@ import androidx.activity.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.GridLayoutManager import com.chad.library.adapter4.util.setOnDebouncedItemClick import com.shuwei.intelligent.shelves.adapter.ShelfAdapter @@ -25,20 +27,26 @@ import com.shuwei.intelligent.shelves.net.RespData import com.shuwei.intelligent.shelves.net.UiState import com.shuwei.intelligent.shelves.serial.SerialPortManager import com.shuwei.intelligent.shelves.task.TaskManager -import com.shuwei.intelligent.shelves.utils.UIUtils +import com.shuwei.intelligent.shelves.utils.binaryToHex +import com.shuwei.intelligent.shelves.utils.ext.gone +import com.shuwei.intelligent.shelves.utils.ext.toast +import com.shuwei.intelligent.shelves.utils.ext.visible import com.shuwei.intelligent.shelves.utils.f2C +import com.shuwei.intelligent.shelves.utils.hexToBinary import com.shuwei.intelligent.shelves.utils.hexToDec +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Date import java.util.Locale -import kotlin.getValue class HomeActivity : BaseActivity() { companion object { private const val TAG = "HomeActivity" + private const val MM_DD_EEEE__HH_MM_SS = "MM月dd日 EEEE HH:mm:ss" + //协议头 const val HEADER = "D6DADEDB" @@ -63,6 +71,8 @@ class HomeActivity : BaseActivity() { private val viewModel: NetViewModel by viewModels() + private val weightArray by lazy { SparseArray() } + @SuppressLint("NotifyDataSetChanged", "HardwareIds") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -71,7 +81,6 @@ class HomeActivity : BaseActivity() { updateLeftStatus("1-1冷藏柜 -°C / -%") - initList() initRecyclerView() lifecycleScope.launch { @@ -94,7 +103,7 @@ class HomeActivity : BaseActivity() { when (state) { is UiState.Loading -> {} is UiState.Success<*> -> getTokenSuccess(state.data) - is UiState.Error -> UIUtils.toast(state.msg) + is UiState.Error -> toast(state.msg) else -> {} } } @@ -113,7 +122,8 @@ class HomeActivity : BaseActivity() { } TaskManager.startTask() - val androidId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID) + var androidId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID) +// androidId = "d0e7a2d5f25c775c" Log.d(TAG, "onCreate: androidId=${androidId}") App.getInstance().deviceId = androidId //"53babf69-0d2f-3875-a649-f2e12f80ad4c1" @@ -130,6 +140,29 @@ class HomeActivity : BaseActivity() { // receiveSerialPortData(data) // delay(500) // } +// } + +// lifecycleScope.launch { +// repeat(100) { +// val sb = StringBuilder().apply { +//// 610200000000000001000000050000800000000006000000050000000400008006000000010000001019008070180080 +// repeat(12) { +// val num = (0..99).random() +// val num2 = (0..99).random() +// val num3 = (0..99).random() +// val num4 = (0..1).random() +// val numStr = if (num <= 9) "0${num}" else "" + num +// val numStr2 = if (num2 <= 9) "0${num2}" else "" + num2 +// val numStr3 = if (num3 <= 9) "0${num3}" else "" + num3 +// val numStr4 = if (num4 == 1) "80" else "00" +// append(numStr).append(numStr2).append(numStr3).append(numStr4) +// } +// } +// val data = +// "${HEADER}0302000000000C${sb}5037414645333633333334333731373056322E313069${FOOTER}" +// receiveSerialPortData(data) +// delay(500) +// } // } } @@ -148,19 +181,20 @@ class HomeActivity : BaseActivity() { @SuppressLint("NotifyDataSetChanged") private fun updateUI(data: RespData<*>) { + binding.include?.root?.gone() Loading.dismiss() if (data.result !is ShelfResult) { - UIUtils.toast("数据错误") + loadEmptyView() return } App.getInstance().canteenId = data.result.canteenId val tempList = data.result.containerGoodsList if (tempList.isNullOrEmpty()) { - UIUtils.toast("数据为空") + loadEmptyView() return } if (tempList.size < 10) { - UIUtils.toast("数据错误") + toast("数据错误") return } list.clear() @@ -175,7 +209,8 @@ class HomeActivity : BaseActivity() { private fun showError(message: String) { Loading.dismiss() - UIUtils.toast(message) + toast(message) + loadEmptyView() } private val serialReader by lazy { StringBuilder() } @@ -199,7 +234,7 @@ class HomeActivity : BaseActivity() { val endIndex = srcData.indexOf(FOOTER) + FOOTER.length serialReader.append(srcData.substring(0, endIndex)) Log.d(TAG, "receiveSerialPortData:serialReader: $serialReader") - data = serialReader.toString().replace(",","") + data = serialReader.toString().replace(",", "") } val cmd = data.substring(HEADER.length, HEADER.length + 4) @@ -215,10 +250,10 @@ class HomeActivity : BaseActivity() { // heartBeat(data) // } -// "0302" -> { -// //获取设备状态 -// getDeviceInfo(data) -// } + "0302" -> { + //获取设备状态 + getDeviceInfo(data) + } else -> {} } @@ -262,13 +297,16 @@ class HomeActivity : BaseActivity() { substring(6, 8) + substring(4, 6) + substring(2, 4) + substring(0, 2) } var realWeight = 0 - if (weightHex.first() in '8'..'F') { - //负数 - val weightHex2 = "0${weightHex.substring(1)}" - realWeight = -1 * weightHex2.toInt() - } else { - //整数 + var firstByteBinary = hexToBinary(weightHex.substring(0, 2)) + if (firstByteBinary.startsWith("0")) { + //正数 realWeight = weightHex.toInt() + } else { + //负数 + firstByteBinary = "0${firstByteBinary.substring(1)}" + val firstByteHex = binaryToHex(firstByteBinary) + weightHex = firstByteHex + weightHex.substring(2) + realWeight = -1 * weightHex.toInt() } val realWeightDouble = realWeight / 1000.0 weightArray.put(index, realWeightDouble) @@ -287,27 +325,33 @@ class HomeActivity : BaseActivity() { } private fun getDeviceInfo(data: String) { -// val weightStartIndex = HEADER.length + 4 + 10 -// val temperatureStartIndex = weightStartIndex + 12 * 8 -// val temperatureEndIndex = temperatureStartIndex + 2 -// val temperatureHex = data.substring(temperatureStartIndex, temperatureEndIndex) -// val temperature = hexToDec(temperatureHex) -// updateLeftStatus("1-1冷藏柜 $temperature°C / 87%") -// -// getWeightInfo( -// start = weightStartIndex, -// end = temperatureStartIndex, -// data = data -// ) -// -// val intent = Intent(ShelfActivity.RECEIVER_DEVICE_INFO) -// intent.putExtra(ShelfActivity.SHELF_WEIGHT, weightArray[clickIndex]) -// intent.putExtra(ShelfActivity.RECEIVER_DEVICE_INFO, data) -// sendBroadcast(intent) + Log.d(TAG, "getDeviceInfo: data=$data") + val weightStartIndex = HEADER.length + 14 + val temperatureStartIndex = weightStartIndex + 12 * 8 + val temperatureEndIndex = temperatureStartIndex + 2 + val temperatureHex = data.substring(temperatureStartIndex, temperatureEndIndex) + val temperature = hexToDec(temperatureHex) + val tempC = f2C(temperature.toDouble()) + val showTemp = "%.1f".format(tempC) + + val percent = 10 * list.count { it.goodsName.isNullOrBlank().not() } + + updateLeftStatus("1-1冷藏柜 ${showTemp}°C / ${percent}%") + + getWeightInfo( + start = weightStartIndex, + end = temperatureStartIndex, + data = data + ) + + if (list.isNotEmpty()) { + val intent = Intent(ShelfActivity.RECEIVER_DEVICE_INFO + list[shelfIndex].deviceNo) + intent.putExtra(ShelfActivity.SHELF_WEIGHT, weightArray[shelfIndex]) + sendBroadcast(intent) + } } - private val weightArray by lazy { SparseArray() } - private var clickIndex = 0 + private var shelfIndex = 0 override fun onDestroy() { lifecycleScope.launch { @@ -319,10 +363,9 @@ class HomeActivity : BaseActivity() { @Suppress("DEPRECATION") private val shelfAdapter by lazy { -// val list = viewModel.getCurrentItems() ShelfAdapter(list).apply { setOnDebouncedItemClick { adapter, view, position -> - this@HomeActivity.clickIndex = position + this@HomeActivity.shelfIndex = position lifecycleScope.launch { val openCmd = if (list[position].deviceNo in 1..5) LEFT_SHELF_OPEN_CMD @@ -330,7 +373,7 @@ class HomeActivity : BaseActivity() { RIGHT_SHELF_OPEN_CMD val openState = SerialPortManager.send(openCmd) if (openState.not()) { - UIUtils.toast("${list[position].goodsName}柜门开启失败") + toast("${list[position].goodsName}柜门开启失败") return@launch } launch(Intent(this@HomeActivity, ShelfActivity::class.java).also { @@ -358,26 +401,15 @@ class HomeActivity : BaseActivity() { layoutManager = GridLayoutManager(this@HomeActivity, 2, GridLayoutManager.VERTICAL, false) adapter = shelfAdapter + + itemAnimator.let { + if (it is DefaultItemAnimator) { + it.supportsChangeAnimations = false + } + } } } - private fun initList() { -//// val list: MutableList = mutableListOf() -// list.add(ShelfModel(deviceNo = 1)) -// list.add(ShelfModel(deviceNo = 6)) -// list.add(ShelfModel(deviceNo = 2)) -// list.add(ShelfModel(deviceNo = 7)) -// list.add(ShelfModel(deviceNo = 3)) -// list.add(ShelfModel(deviceNo = 8)) -// list.add(ShelfModel(deviceNo = 4)) -// list.add(ShelfModel(deviceNo = 9)) -// list.add(ShelfModel(deviceNo = 5)) -// list.add(ShelfModel(deviceNo = 10)) -//// viewModel.updateItems(list) - } - - private val MM_DD_EEEE__HH_MM_SS = "MM月dd日 EEEE HH:mm:ss" - private fun updateDateTime() { val sdf = SimpleDateFormat(MM_DD_EEEE__HH_MM_SS, Locale.CHINA) val dateTime = sdf.format(Date()) @@ -402,4 +434,19 @@ class HomeActivity : BaseActivity() { super.onPause() handler.removeCallbacks(updateTask) } + + @SuppressLint("NotifyDataSetChanged") + private fun loadEmptyView() { + list.clear() + shelfAdapter.notifyDataSetChanged() + + binding.include?.let { + it.root.visible() + it.root.setOnClickListener { + viewModel.getAccessToken(App.getInstance().deviceId) + } + it.ivEmptyIcon.setImageResource(R.drawable.ic_empty_white) + it.tvEmptyContent.setTextColor(Color.WHITE) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt index db7ad60..d0c74b3 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt @@ -10,6 +10,7 @@ import android.os.Handler import android.os.Looper import android.util.Log import androidx.activity.viewModels +import androidx.core.widget.addTextChangedListener import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle @@ -30,11 +31,12 @@ import com.shuwei.intelligent.shelves.net.UiState import com.shuwei.intelligent.shelves.serial.SerialPortManager import com.shuwei.intelligent.shelves.utils.DateTimeUtil import com.shuwei.intelligent.shelves.utils.KeyboardUtil -import com.shuwei.intelligent.shelves.utils.UIUtils import com.shuwei.intelligent.shelves.utils.ext.addOnActionSearchListener import com.shuwei.intelligent.shelves.utils.ext.clickWithDebounce +import com.shuwei.intelligent.shelves.utils.ext.gone import com.shuwei.intelligent.shelves.utils.ext.toJsonString import com.shuwei.intelligent.shelves.utils.ext.toast +import com.shuwei.intelligent.shelves.utils.ext.visible import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Date @@ -45,11 +47,14 @@ class ShelfActivity : BaseActivity() { companion object { private const val TAG = "ShelfActivity" + + private const val YYYY_MM_DD__EEEE_HH_MM_SS = "yyyy年MM月dd日 EEEE***HH:mm:ss" const val SHELF_MODEL = "shelfModel" const val RECEIVER_DEVICE_INFO = "receiverDeviceInfo" const val SHELF_WEIGHT = "shelfWeight" + const val SHELF_INDEX = "shelfIndex" - const val PAGE_SIZE = 50 + const val PAGE_SIZE = 100 } private lateinit var binding: ActivityShelfBinding @@ -60,6 +65,7 @@ class ShelfActivity : BaseActivity() { private var realWeight: Int = 0 private var pageNo: Int = 1 + private var shelfIndex: Int = 0 private val viewModel: NetViewModel by viewModels() @@ -81,19 +87,23 @@ class ShelfActivity : BaseActivity() { } initRecyclerView() -// initWeight() + binding.etInputFood.run { addOnActionSearchListener { if (text.isNullOrBlank()) { toast(hint.toString()) return@addOnActionSearchListener } -// loadSearchData() - viewModel.getGoodsList( - canteenId = "1599670511042785282", goodsName = text.toString().trim() - ) + pageNo = 1 + getGoodsList() KeyboardUtil.hideKeyboard(context, this) } + addTextChangedListener(afterTextChanged = {editable -> + if (editable.isNullOrBlank()) { + pageNo = 1 + getGoodsList() + } + }) } binding.btnConfirm.clickWithDebounce { @@ -103,7 +113,7 @@ class ShelfActivity : BaseActivity() { } val data = ShelfModel( shelfName = shelfModel?.shelfName, - goodsId = list[clickIndex].goodsId?:"", + goodsId = list[clickIndex].goodsId ?: "", goodsName = list[clickIndex].goodsName, weight = realWeight / 1000.0, createTime = DateTimeUtil.formatDateTime(dateTime = Date()) @@ -128,6 +138,8 @@ class ShelfActivity : BaseActivity() { //清零 realWeight = 0 binding.tvFoodWeight.text = "${realWeight}克" + + SerialPortManager.send(DEVICE_INFO_CMD) } KeyboardUtil.hideKeyboard(v.context, v) } @@ -147,7 +159,7 @@ class ShelfActivity : BaseActivity() { } } - registerReceiver(receiver, IntentFilter(RECEIVER_DEVICE_INFO)) + registerReceiver(receiver, IntentFilter(RECEIVER_DEVICE_INFO + shelfModel?.deviceNo)) binding.refreshLayout.let { it.setEnableRefresh(true) @@ -176,7 +188,10 @@ class ShelfActivity : BaseActivity() { private fun getGoodsList() { viewModel.getGoodsList( - canteenId = App.getInstance().canteenId, pageNo = pageNo, pageSize = PAGE_SIZE + canteenId = App.getInstance().canteenId, + goodsName = binding.etInputFood.text.trim().toString(), + pageNo = pageNo, + pageSize = PAGE_SIZE ) } @@ -186,15 +201,20 @@ class ShelfActivity : BaseActivity() { @SuppressLint("NotifyDataSetChanged") private fun updateUI(data: RespData<*>) { + binding.include?.root?.gone() finishRefresh() - Loading.dismiss() + binding.root.postDelayed({ Loading.dismiss() }, 200) Log.d(TAG, "updateUI: ${data.toJsonString()}") if (data.result !is GoodsRecord) { - UIUtils.toast("数据错误") + if (pageNo == 1) { + loadEmptyView() + } return } if (data.result.records.isNullOrEmpty()) { - UIUtils.toast("数据错误") + if (pageNo == 1) { + loadEmptyView() + } return } if (pageNo == 1) { @@ -213,15 +233,18 @@ class ShelfActivity : BaseActivity() { private fun showError(message: String) { finishRefresh() Loading.dismiss() - UIUtils.toast(message) + toast(message) + if (pageNo == 1) { + loadEmptyView() + } } private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { intent?.let { - val data = it.getStringExtra(RECEIVER_DEVICE_INFO) - Log.d(TAG, "onReceive: $data") +// val data = it.getStringExtra(RECEIVER_DEVICE_INFO) val weight = it.getDoubleExtra(SHELF_WEIGHT, 0.0) + Log.d(TAG, "getDeviceInfo:onReceive: weight=$weight") realWeight = (weight * 1000).toInt() binding.tvFoodWeight.text = "${realWeight}克" } @@ -233,31 +256,6 @@ class ShelfActivity : BaseActivity() { super.onDestroy() } -// private fun initWeight() { -// realWeight = Random.nextInt(1, 5001) -// } - -// private fun loadSearchData() { -// list.add(SearchModel(foodId = 1000, foodName = "菲律宾乳猪五花肉")) -// list.add(SearchModel(foodId = 1001, foodName = "金针菇")) -// list.add(SearchModel(foodId = 1002, foodName = "大菠菜")) -// list.add(SearchModel(foodId = 1003, foodName = "清远麻鸡块")) -// list.add(SearchModel(foodId = 1004, foodName = "普罗旺斯番茄")) -// list.add(SearchModel(foodId = 1005, foodName = "长条茄子")) -// list.add(SearchModel(foodId = 1006, foodName = "得莫利鱼")) -// list.add(SearchModel(foodId = 1007, foodName = "土豆丝")) -// list.add(SearchModel(foodId = 1008, foodName = "辣椒炒肉")) -// list.add(SearchModel(foodId = 1009, foodName = "雪菜烧豆腐")) -// list.add(SearchModel(foodId = 1010, foodName = "冬虫夏草炝拌芥兰苗")) -// list.add( -// SearchModel( -// foodId = 1011, -// foodName = "蘑菇玉米山药莲藕胡萝卜红枣莲子枸杞清炖排骨汤" -// ) -// ) -// searchAdapter.notifyDataSetChanged() -// } - private val list: MutableList = mutableListOf() private val searchAdapter by lazy { SearchAdapter(list).apply { @@ -279,8 +277,6 @@ class ShelfActivity : BaseActivity() { } } - private val YYYY_MM_DD__EEEE_HH_MM_SS = "yyyy年MM月dd日 EEEE***HH:mm:ss" - private fun updateDateTime() { val sdf = SimpleDateFormat(YYYY_MM_DD__EEEE_HH_MM_SS, Locale.CHINA) val dateTime = sdf.format(Date()) @@ -308,4 +304,22 @@ class ShelfActivity : BaseActivity() { handler.removeCallbacks(updateTask) } + @SuppressLint("NotifyDataSetChanged") + private fun loadEmptyView() { + list.clear() + searchAdapter.notifyDataSetChanged() + binding.include?.let { + it.root.visible() + it.root.setOnClickListener { + pageNo = 1 + getGoodsList() + } + it.ivEmptyIcon.setImageResource(R.drawable.ic_empty_gray) + } + binding.refreshLayout.run { + setEnableRefresh(false) + setEnableLoadMore(false) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/utils/DecToHex.kt b/app/src/main/java/com/shuwei/intelligent/shelves/utils/DecToHex.kt index 972da96..03dc761 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/utils/DecToHex.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/utils/DecToHex.kt @@ -45,3 +45,49 @@ fun byteArrayToHexString(bytes: ByteArray): String { fun String.hexToBytes(): ByteArray = hexStringToByteArray(this) fun ByteArray.toHexString2(): String = byteArrayToHexString(this) +fun hexToBinary(hex: String): String { + val hexToBinaryMap = mapOf( + '0' to "0000", '1' to "0001", '2' to "0010", '3' to "0011", + '4' to "0100", '5' to "0101", '6' to "0110", '7' to "0111", + '8' to "1000", '9' to "1001", 'A' to "1010", 'B' to "1011", + 'C' to "1100", 'D' to "1101", 'E' to "1110", 'F' to "1111" + ) + + return hex.map { char -> + hexToBinaryMap[char] ?: throw IllegalArgumentException("非法十六进制字符: $char") + }.joinToString("") +} + +fun binaryToHex(binary: String): String { + // 补齐到4的倍数长度(方便分组) + val paddedBinary = binary.padStart( + length = ((binary.length + 3) / 4) * 4, + padChar = '0' + ) + + // 每4位二进制对应1位十六进制 + return paddedBinary.chunked(4).joinToString("") { nibble -> + when (nibble) { + "0000" -> "0" + "0001" -> "1" + "0010" -> "2" + "0011" -> "3" + "0100" -> "4" + "0101" -> "5" + "0110" -> "6" + "0111" -> "7" + "1000" -> "8" + "1001" -> "9" + "1010" -> "A" + "1011" -> "B" + "1100" -> "C" + "1101" -> "D" + "1110" -> "E" + "1111" -> "F" + else -> throw IllegalArgumentException("无效的二进制段: $nibble") + } + } + .trimStart('0') // 去除前导零 + .ifEmpty { "0" } // 处理全零情况 +} + diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/utils/UIUtils.kt b/app/src/main/java/com/shuwei/intelligent/shelves/utils/UIUtils.kt deleted file mode 100644 index b5a780d..0000000 --- a/app/src/main/java/com/shuwei/intelligent/shelves/utils/UIUtils.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.shuwei.intelligent.shelves.utils - -import android.widget.Toast -import com.shuwei.intelligent.shelves.App -//D6DADEDB0302000001000C06 -object UIUtils { - fun toast(strRes: Int) { - Toast.makeText(App.getInstance(), strRes, Toast.LENGTH_SHORT).show() - } - - fun toast(str: String) { - Toast.makeText(App.getInstance(), str, Toast.LENGTH_SHORT).show() - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/ic_empty_gray.png b/app/src/main/res/drawable-xxxhdpi/ic_empty_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..c254fe61e66141baaa1c9ba8ca2b9cb78a229328 GIT binary patch literal 7126 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_empty_white.png b/app/src/main/res/drawable-xxxhdpi/ic_empty_white.png new file mode 100644 index 0000000000000000000000000000000000000000..ccef008dbf4888a28ef41bee29a42386937fd572 GIT binary patch literal 6199 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout-sw360dp/activity_home.xml b/app/src/main/res/layout-sw360dp/activity_home.xml index 8ceae06..23803d3 100644 --- a/app/src/main/res/layout-sw360dp/activity_home.xml +++ b/app/src/main/res/layout-sw360dp/activity_home.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw360dp/activity_shelf.xml b/app/src/main/res/layout-sw360dp/activity_shelf.xml index fb033d4..6bd2afe 100644 --- a/app/src/main/res/layout-sw360dp/activity_shelf.xml +++ b/app/src/main/res/layout-sw360dp/activity_shelf.xml @@ -156,37 +156,50 @@ android:textSize="15sp" tools:ignore="Autofill,HardcodedText,TextFields" /> - - + android:layout_height="match_parent"> - + + + + + + + + - - - - + layout="@layout/layout_empty_view" + android:visibility="gone"/> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp/activity_shelf.xml b/app/src/main/res/layout-sw600dp/activity_shelf.xml index 395917e..717f97a 100644 --- a/app/src/main/res/layout-sw600dp/activity_shelf.xml +++ b/app/src/main/res/layout-sw600dp/activity_shelf.xml @@ -159,6 +159,7 @@ @@ -172,7 +173,6 @@ android:layout_height="match_parent" android:paddingStart="36dp" android:paddingBottom="12dp" - android:layout_marginTop="24dp" android:paddingTop="12dp" android:paddingEnd="36dp" android:clipToPadding="false" diff --git a/app/src/main/res/layout-sw600dp/layout_empty_view.xml b/app/src/main/res/layout-sw600dp/layout_empty_view.xml new file mode 100644 index 0000000..322e709 --- /dev/null +++ b/app/src/main/res/layout-sw600dp/layout_empty_view.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file