From 8f1e067334f75ea3ddb39e013dd97668362b08c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Tue, 14 Apr 2026 19:28:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E9=87=8D=E6=9E=84=E6=A3=80?= =?UTF-8?q?=E9=AA=8C=E5=92=8C=E5=96=B7=E6=B6=82=E6=B4=BB=E5=8A=A8=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 InspectionActivity 和 SprayingActivity 继承自 BaseListFormLayoutNormalActivity - 添加 RecyclerView 水平方向布局支持 - 实现 CommonPagedAdapter 来管理列表项 - 添加语音命令处理包括"驳回"、"拒绝"、"同意"、"通过"等操作 - 更新 activity_inspection.xml 和 activity_spraying.xml 布局文件 - 添加任务详情显示包括任务编号、供应商、创建时间等信息 - 创建 item_photo.xml 布局用于拍照功能 - 新增 bg_photo.xml 圆角边框样式 - 移除 bg_task_title_selected.xml 中的填充颜色 - 添加 InspectionVM 和 SprayingVM 视图模型来管理数据加载 --- .../nova/brain/glass/ui/InspectionActivity.kt | 36 +++++- .../nova/brain/glass/ui/SprayingActivity.kt | 28 ++++- .../brain/glass/viewmodel/InspectionVM.kt | 17 +++ .../nova/brain/glass/viewmodel/SprayingVM.kt | 16 +++ app/src/main/res/drawable/bg_photo.xml | 8 ++ .../res/drawable/bg_task_title_selected.xml | 1 - .../main/res/layout/activity_inspection.xml | 112 ++++++++++++------ app/src/main/res/layout/activity_spraying.xml | 107 +++++++++++------ app/src/main/res/layout/item_photo.xml | 21 ++++ app/src/main/res/mipmap-hdpi/paizhao.png | Bin 0 -> 1122 bytes app/src/main/res/mipmap-mdpi/paizhao.png | Bin 0 -> 574 bytes app/src/main/res/mipmap-xhdpi/paizhao.png | Bin 0 -> 1423 bytes app/src/main/res/mipmap-xxhdpi/paizhao.png | Bin 0 -> 2688 bytes app/src/main/res/mipmap-xxxhdpi/paizhao.png | Bin 0 -> 3339 bytes 14 files changed, 269 insertions(+), 77 deletions(-) create mode 100644 app/src/main/java/com/nova/brain/glass/viewmodel/InspectionVM.kt create mode 100644 app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt create mode 100644 app/src/main/res/drawable/bg_photo.xml create mode 100644 app/src/main/res/layout/item_photo.xml create mode 100644 app/src/main/res/mipmap-hdpi/paizhao.png create mode 100644 app/src/main/res/mipmap-mdpi/paizhao.png create mode 100644 app/src/main/res/mipmap-xhdpi/paizhao.png create mode 100644 app/src/main/res/mipmap-xxhdpi/paizhao.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/paizhao.png diff --git a/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt index 7437e08..8893d46 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/InspectionActivity.kt @@ -1,16 +1,23 @@ package com.nova.brain.glass.ui +import androidx.recyclerview.widget.RecyclerView import com.nova.brain.glass.R -import com.nova.brain.glass.databinding.ActivityFoBinding import com.nova.brain.glass.databinding.ActivityInspectionBinding -import com.nova.brain.glass.databinding.ActivityReviewBinding import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdServiceHelper -import com.xuqm.base.ui.BaseActivity +import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.viewmodel.ItemListVM +import com.xuqm.base.adapter.BasePagedAdapter +import com.xuqm.base.adapter.CommonPagedAdapter +import com.xuqm.base.adapter.ViewHolder +import com.xuqm.base.ui.BaseListFormLayoutNormalActivity -class InspectionActivity : BaseActivity() { +class InspectionActivity : BaseListFormLayoutNormalActivity() { override fun getLayoutId(): Int =R.layout.activity_inspection override fun fullscreen(): Boolean = true + + override fun getRecyclerOrientation(): Int = RecyclerView.HORIZONTAL + private val listener = object : OfflineCmdListener { override fun onOfflineCmd(cmd: String) { runOnUiThread { @@ -18,6 +25,12 @@ class InspectionActivity : BaseActivity() { "退出","返回","退回"->{ finish() } + "驳回","拒绝","不同意"->{ + finish() + } + "同意","通过"->{ + finish() + } } } } @@ -31,4 +44,19 @@ class InspectionActivity : BaseActivity() { super.onDestroy() OfflineCmdServiceHelper.removeOnLineListener(listener) } + + private val adapter = object : CommonPagedAdapter(R.layout.item_item) { + override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { + holder + .setText(R.id.text, item.text) + .setClickListener(R.id.text) { + when (item.text) { + "同意" -> finish() + "驳回" -> finish() + } + } + } + } + + override fun adapter(): BasePagedAdapter = adapter } diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt index 162ee15..2a5a356 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt @@ -1,15 +1,24 @@ package com.nova.brain.glass.ui +import androidx.recyclerview.widget.RecyclerView import com.nova.brain.glass.R import com.nova.brain.glass.databinding.ActivitySprayingBinding import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdServiceHelper -import com.xuqm.base.ui.BaseActivity +import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.viewmodel.ItemListVM +import com.nova.brain.glass.viewmodel.SprayingVM +import com.xuqm.base.adapter.BasePagedAdapter +import com.xuqm.base.adapter.CommonPagedAdapter +import com.xuqm.base.adapter.ViewHolder +import com.xuqm.base.ui.BaseListFormLayoutNormalActivity -class SprayingActivity : BaseActivity() { +class SprayingActivity : BaseListFormLayoutNormalActivity() { override fun getLayoutId(): Int = R.layout.activity_spraying override fun fullscreen(): Boolean = true + override fun getRecyclerOrientation(): Int = RecyclerView.HORIZONTAL + private val listener = object : OfflineCmdListener { override fun onOfflineCmd(cmd: String) { runOnUiThread { @@ -31,4 +40,19 @@ class SprayingActivity : BaseActivity() { super.onDestroy() OfflineCmdServiceHelper.removeOnLineListener(listener) } + + private val adapter = object : CommonPagedAdapter(R.layout.item_photo) { + override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { + holder + .setClickListener(R.id.photo) { + when (item.text) { + "拍照" -> { + + } + } + } + } + } + + override fun adapter(): BasePagedAdapter = adapter } diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/InspectionVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/InspectionVM.kt new file mode 100644 index 0000000..c0a891f --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/InspectionVM.kt @@ -0,0 +1,17 @@ +package com.nova.brain.glass.viewmodel + +import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.model.TaskItem +import com.xuqm.base.viewmodel.BaseListViewModel +import com.xuqm.base.viewmodel.callback.Response + +class InspectionVM: BaseListViewModel() { + override fun loadData( + page: Int, + onResponse: Response + ) { + onResponse.onResponse(arrayListOf().apply { + add(ItemItem("拍照")) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt new file mode 100644 index 0000000..52b3d96 --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt @@ -0,0 +1,16 @@ +package com.nova.brain.glass.viewmodel + +import com.nova.brain.glass.model.ItemItem +import com.xuqm.base.viewmodel.BaseListViewModel +import com.xuqm.base.viewmodel.callback.Response + +class SprayingVM: BaseListViewModel() { + override fun loadData( + page: Int, + onResponse: Response + ) { + onResponse.onResponse(arrayListOf().apply { + add(ItemItem("拍照")) + }) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_photo.xml b/app/src/main/res/drawable/bg_photo.xml new file mode 100644 index 0000000..a6b8907 --- /dev/null +++ b/app/src/main/res/drawable/bg_photo.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_task_title_selected.xml b/app/src/main/res/drawable/bg_task_title_selected.xml index aaf1996..64a02c5 100644 --- a/app/src/main/res/drawable/bg_task_title_selected.xml +++ b/app/src/main/res/drawable/bg_task_title_selected.xml @@ -1,7 +1,6 @@ - diff --git a/app/src/main/res/layout/activity_inspection.xml b/app/src/main/res/layout/activity_inspection.xml index 4af5ae2..2742c21 100644 --- a/app/src/main/res/layout/activity_inspection.xml +++ b/app/src/main/res/layout/activity_inspection.xml @@ -1,8 +1,8 @@ + - + app:layout_constraintTop_toBottomOf="@+id/tvTaskHeader"> - + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/content" /> + android:textSize="14sp"/> - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_spraying.xml b/app/src/main/res/layout/activity_spraying.xml index 69e9e11..2742c21 100644 --- a/app/src/main/res/layout/activity_spraying.xml +++ b/app/src/main/res/layout/activity_spraying.xml @@ -1,5 +1,6 @@ + - + app:layout_constraintTop_toBottomOf="@+id/tvTaskHeader"> - + + + + + + + + + + + + - + app:layout_constraintTop_toBottomOf="@id/content" /> + android:textSize="14sp"/> diff --git a/app/src/main/res/layout/item_photo.xml b/app/src/main/res/layout/item_photo.xml new file mode 100644 index 0000000..22c329e --- /dev/null +++ b/app/src/main/res/layout/item_photo.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/paizhao.png b/app/src/main/res/mipmap-hdpi/paizhao.png new file mode 100644 index 0000000000000000000000000000000000000000..49d651a291daf26ba0a688daf5bccbf56f99285a GIT binary patch literal 1122 zcmV-o1fBbdP)Pfhx7VT+&*C5Ze$FiejNsNR>eA54EJ&5O4P#XD_)lO%rh0*_nOknb~<} z-gga_xzdu3CBp3cN$X!oSbswGrKHXLruOfuCnHIS|I3yjlY)RtrCB!lwb03u@;E}Y z2~Cp?Y#IR?4Y@6(G=zaPAe2Ln!KW!?@B81$lagIW!*>m(tKj8N7TGgejP;HdVqg7u zg1NB)_Kpw4ddKf|;@w*GsD-p9BvG~a17_Z`=W?FOK|uxtnZ5g zv_;O-(p;U87vhnQ-lO#+JW>KpD+NhPO*vlkTu52}=(FOlHzpSQ5W=5HwrW6&cCSU0 zb~Q`>2u8eADN}zP?puxxKB2WAyS8-rADF#cB)hRiTD*StOontegQj^dzD)!Z0q~wt z;{nImqbHa<)zAFtNQ&$o?PFg^)U;ZMA6Os;gU_tRN1-*J!7~e{kWMXh7G%6~THex@>S%bNM~8pSLT`OOCFz=^_y?oy<|2%6 zu}!!XyMZi~P5m0h^KO*>H*UYKtga#q>&l2F9uC}lbX0W#Y{@$A!^-r}A#~4FpaFC* z>9jRDU}0Htj70|na#lILtPPuAulO4zbGIYt*0$-OrzR=bX(7X)qAQ@;!l}ul-E#9l zT`;G(cnW^oCV6p%+Gr5}PHjb3AUp=)57szcMC}`zbh-*F$|pI(MPih?Rz(A)0MCuq z=H(dke^>_Ft)Q_QGjAp&y;iXLng#O8afdObgT@B02)G&G_HWpI6$>tw2dbH&&67Yw z7C0lb$i6emXSdq*6n8w7scu>{8Ayi}XGBlz2K-yvU108L)@J2pdbUfU`HoUlIGYfnP5`^yq$RQvn%uevX#YlL|f!a-xe11ev@ zKzW#$cB)E$P%8mhH7mASt5s&Q8WwTI#l=dkKx*|QuPKY6YTRMKwdz}gkb{A7+y4Uq o0RR6?Qa``|000I_L_t&o0C%(LfaR8WhX4Qo07*qoM6N<$f)aWb6aWAK literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/paizhao.png b/app/src/main/res/mipmap-mdpi/paizhao.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8cd6d530cff5bd1f57b926829b060cfca51cfd GIT binary patch literal 574 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