From 82217b4fb1c7654e212c2a862e9fa53c03bd1284 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Mon, 20 Apr 2026 18:26:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(activity):=20=E5=90=88=E5=B9=B6=E9=87=87?= =?UTF-8?q?=E9=9B=86=E5=8A=9F=E8=83=BD=E8=87=B3=20PrepareCookActivity=20?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E8=AF=86=E5=88=AB=E9=A1=B5=E9=87=8D?= =?UTF-8?q?=E9=87=8F=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 DishSamplingActivity 逻辑合并至 PrepareCookActivity,根据 cookMode 区分采集/制作模式 - 布局替换:activity_prepare_cook 第一子 View 改为搜索栏(etInputDish + ivDishSearch),删除第二个子 LinearLayout - InitActivity / HomeActivity / SamplingListActivity 改用 PrepareCookActivity 替代 DishSamplingActivity - FoodRecognizeActivity 新增 selectedPosition 字段,避免通过 isClicked 线性查找索引 - 优化重量更新逻辑:重量增加立即同步,重量减少延迟 3 秒更新,防止关页前误覆盖用量 - foodSelectCallback 改为累加同 goodsId 的 useWeight,不再限制重复添加 Co-Authored-By: Claude Sonnet 4.6 --- .../dish/match/adapter/DishPartAdapter.kt | 17 +- .../match/adapter/GoodsInfoSearchAdapter.kt | 18 +- .../dish/match/entity/CookFoodGoodsEntity.kt | 3 + .../dish/match/ui/FoodRecognizeActivity.kt | 83 +++-- .../com/shuwei/dish/match/ui/HomeActivity.kt | 4 +- .../com/shuwei/dish/match/ui/InitActivity.kt | 4 +- .../dish/match/ui/PrepareCookActivity.kt | 313 +++++++++--------- .../dish/match/ui/SamplingListActivity.kt | 6 +- .../res/drawable-xxxhdpi/ic_dish_clear.png | Bin 12079 -> 11111 bytes .../res/layout/activity_food_recognize.xml | 6 +- .../main/res/layout/activity_prepare_cook.xml | 243 ++------------ .../main/res/layout/list_item_dish_cook.xml | 2 +- .../layout/list_item_search_goods_info.xml | 18 +- 13 files changed, 312 insertions(+), 405 deletions(-) diff --git a/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt b/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt index c20ecc3..95d4ceb 100644 --- a/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt +++ b/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt @@ -9,7 +9,9 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder import com.shuwei.dish.match.R import com.shuwei.dish.match.databinding.ListItemDishCookBinding import com.shuwei.dish.match.entity.CookFoodGoodsEntity +import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.roundedOneDecimalPlace +import com.shuwei.dish.match.utils.ext.visible import java.text.DecimalFormat class DishPartAdapter(list: MutableList) : @@ -36,12 +38,16 @@ class DishPartAdapter(list: MutableList) : if (item.isSamplingPage) R.color.black999 else R.color.dish_green ) ) + + ivOperateIcon.run { + if (item.isSamplingPage) gone() else visible() + } + ivClearIcon.visible() + ivClearIcon.setImageResource( + if (item.isOriginalData) R.drawable.ic_dish_clear + else R.drawable.ic_delete + ) ivOperateIcon.setImageResource( - if (item.isSamplingPage) - //采集页面 - R.drawable.ic_delete - else - //制作页面 if (item.isSetFinished) R.drawable.ic_dish_selected else R.drawable.ic_dish_unselected ) @@ -53,5 +59,4 @@ class DishPartAdapter(list: MutableList) : } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt b/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt index 3473697..3846ea7 100644 --- a/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt +++ b/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt @@ -9,6 +9,9 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder import com.shuwei.dish.match.R import com.shuwei.dish.match.databinding.ListItemSearchGoodsInfoBinding import com.shuwei.dish.match.entity.CookFoodGoodsEntity +import com.shuwei.dish.match.utils.ext.gone +import com.shuwei.dish.match.utils.ext.roundedDecimalPlace +import com.shuwei.dish.match.utils.ext.visible class GoodsInfoSearchAdapter(private var list: MutableList) : BaseQuickAdapter(list) { @@ -18,20 +21,29 @@ class GoodsInfoSearchAdapter(private var list: MutableList) position: Int, item: CookFoodGoodsEntity? ) { + item ?: return holder.binding.tvGoodsInfo.run { - text = item?.goodsName + text = item.goodsName setBackgroundResource( - if (item?.isClicked == true) R.drawable.shape_green_stroke + if (item.isClicked == true) R.drawable.shape_green_stroke else R.drawable.shape_white_12_corners ) setTextColor( ContextCompat.getColor( context, - if (item?.isClicked == true) R.color.dish_green + if (item.isClicked == true) R.color.dish_green else R.color.black666 ) ) } + if (item.foodScore == -1){ + holder.binding.tvFoodScore.gone() + } else { + holder.binding.tvFoodScore.let { + it.visible() + it.text = "${(item.foodScore / 100.0).roundedDecimalPlace(2)}%" + } + } } override fun onCreateViewHolder( diff --git a/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt b/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt index 507a21c..d7cb3e6 100644 --- a/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt +++ b/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt @@ -86,4 +86,7 @@ class CookFoodGoodsEntity( //true-原始数据,false-非原始数据 @Ignore var isOriginalData: Boolean = true + + @Ignore + var foodScore: Int = -1 } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt index fc0df2b..5210bc3 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt @@ -16,6 +16,7 @@ import com.shuwei.dish.match.utils.WeightUtil import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.visible +import androidx.core.net.toUri /** * 食材识别结果页面 @@ -71,12 +72,25 @@ class FoodRecognizeActivity : BaseActivity() { private val list = mutableListOf() + /** 当前选中的列表位置,-1 表示无选中 */ + private var selectedPosition = -1 + + /** 秤1当前实时重量 */ + private var currentWeight = 0.0 + + /** 重量减少时延迟更新的任务,页面关闭前取消可防止用错误重量 */ + private var pendingWeightRunnable: Runnable? = null + + /** 当前待延迟更新的目标重量,避免相同重量重复重置计时器 */ + private var pendingWeight = 0.0 + private val adapter = GoodsInfoSearchAdapter(list).apply { setOnItemClickListener { _, _, position -> - // 更新选中状态 list.forEachIndexed { i, item -> item.isClicked = (i == position) } + // 点击选择时记录当前秤重量 + list[position].useWeight = currentWeight notifyDataSetChanged() - // 同步更新选中食材名称 + selectedPosition = position binding.tvSelectedFood.text = list[position].goodsName ?: "-" } } @@ -85,6 +99,7 @@ class FoodRecognizeActivity : BaseActivity() { super.onCreate(savedInstanceState) binding = ActivityFoodRecognizeBinding.inflate(layoutInflater) setContentView(binding.root) + registerWeightListener() setHeaderBackground() // 显示标题栏 @@ -93,7 +108,6 @@ class FoodRecognizeActivity : BaseActivity() { initData() initRecyclerView() initClickListeners() - registerWeightListener() } /** @@ -103,7 +117,7 @@ class FoodRecognizeActivity : BaseActivity() { // 加载食材照片 val imageUri = intent.getStringExtra(EXTRA_IMAGE_URI) if (!imageUri.isNullOrBlank()) { - binding.ivFoodPhoto.setImageURI(Uri.parse(imageUri)) + binding.ivFoodPhoto.setImageURI(imageUri.toUri()) } // 取出内存缓存的食材列表,取用后立即清空 @@ -111,6 +125,7 @@ class FoodRecognizeActivity : BaseActivity() { if (!goodsList.isNullOrEmpty()) { list.addAll(goodsList) // 默认选中第一项 + selectedPosition = 0 list[0].isClicked = true binding.tvSelectedFood.text = list[0].goodsName ?: "-" } @@ -144,14 +159,11 @@ class FoodRecognizeActivity : BaseActivity() { private fun initClickListeners() { // 更换食材:打开食材搜索弹窗 binding.btnChangeFood.clickWithDebounce { - val currentName = if (list.isNotEmpty()) list.firstOrNull { it.isClicked }?.goodsName else null + val currentName = list.getOrNull(selectedPosition)?.goodsName FoodSearchDialog( activity = this, defGoodsName = currentName, - onItemSelected = { item -> - // 用搜索结果替换当前选中食材 - updateSelectedFood(item) - } + onItemSelected = { item -> updateSelectedFood(item) } ).show() } @@ -164,17 +176,14 @@ class FoodRecognizeActivity : BaseActivity() { */ @SuppressLint("NotifyDataSetChanged") private fun updateSelectedFood(item: CookFoodGoodsEntity) { - item.isClicked = true - val clickedIndex = list.indexOfFirst { it.isClicked && it.goodsId != item.goodsId } - if (clickedIndex >= 0) { - list[clickedIndex].isClicked = false - } - // 若列表中已存在则直接选中,否则插入到首位 val existIndex = list.indexOfFirst { it.goodsId == item.goodsId } if (existIndex >= 0) { list.forEachIndexed { i, e -> e.isClicked = (i == existIndex) } + selectedPosition = existIndex } else { list.add(0, item) + list.forEachIndexed { i, e -> e.isClicked = (i == 0) } + selectedPosition = 0 } adapter.notifyDataSetChanged() binding.tvSelectedFood.text = item.goodsName ?: "-" @@ -183,22 +192,55 @@ class FoodRecognizeActivity : BaseActivity() { /** * 注册秤1重量监听 + * 只有重量高于识别阈值时才更新选中食材的 useWeight, + * 低于阈值说明食材已被取走,保留上次有效值等待页面关闭 */ private fun registerWeightListener() { - WeightUtil.addWeightListener(TAG) { address, _, weight -> - if (address == AddressUtil.ONE) { + WeightUtil.addWeightListener(TAG) { address, state, weight -> + if (address == AddressUtil.ONE && state == WeightUtil.STATE_STABLE) { runOnUiThread { - binding.tvWeight.text = "$weight g" + currentWeight = weight + binding.tvWeight.run { + if (tag != weight) { + text = "$weight g" + tag = weight + } + } + if (weight >= PrepareCookActivity.WEIGHT_RECOGNIZE_VALUE) { + adapter.items.firstOrNull { it.isClicked }?.let { item -> + if (weight > (item.useWeight ?: 0.0)) { + // 重量增加:立即更新 + cancelPendingWeightUpdate() + item.useWeight = currentWeight + } else if (pendingWeight != weight) { + // 重量减少且目标值变化:重置延迟任务,3 秒无新变化后更新 + cancelPendingWeightUpdate() + pendingWeight = weight + pendingWeightRunnable = Runnable { + item.useWeight = weight + pendingWeightRunnable = null + }.also { handler.postDelayed(it, 3000) } + } + } + } } } } } + /** + * 取消待执行的延迟重量更新任务 + */ + private fun cancelPendingWeightUpdate() { + pendingWeightRunnable?.let { handler.removeCallbacks(it) } + pendingWeightRunnable = null + } + /** * 携带当前选中食材关闭页面 */ private fun finishWithResult() { - val selected = list.firstOrNull { it.isClicked } + val selected = list.getOrNull(selectedPosition) val intent = Intent().apply { selected?.let { putExtra(EXTRA_SELECTED_ITEM, it) } } @@ -208,6 +250,7 @@ class FoodRecognizeActivity : BaseActivity() { override fun onDestroy() { super.onDestroy() - WeightUtil.removeWeightListener(TAG) + cancelPendingWeightUpdate() +// WeightUtil.removeWeightListener(TAG) } } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt index 5b1ec1b..6df75e4 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt @@ -158,8 +158,8 @@ class HomeActivity : BaseActivity() { return@countCookFood } //无烹饪数据打开新增采样页面 - startActivity { - putExtra(DishSamplingActivity.PAGE_FROM, DishSamplingActivity.HOME) + startActivity { + putExtra(PrepareCookActivity.PAGE_FROM, PrepareCookActivity.HOME) } finish() } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt index a43cef0..9dda7f8 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt @@ -113,8 +113,8 @@ class InitActivity : BaseActivity() { return@countCookFood } //无烹饪数据打开新增采样页面 - startActivity { - putExtra(DishSamplingActivity.PAGE_FROM, DishSamplingActivity.HOME) + startActivity { + putExtra(PrepareCookActivity.PAGE_FROM, PrepareCookActivity.HOME) } } } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt index f61fab4..037f9c5 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt @@ -1,31 +1,35 @@ package com.shuwei.dish.match.ui import android.annotation.SuppressLint -import android.graphics.Typeface +import android.content.Intent import android.net.Uri import android.os.Bundle import android.util.Log +import android.view.View +import android.view.ViewGroup +import androidx.activity.addCallback +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import com.shuwei.dish.match.R import com.shuwei.dish.match.adapter.DishPartAdapter import com.shuwei.dish.match.base.BaseActivity import com.shuwei.dish.match.databinding.ActivityPrepareCookBinding +import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding import com.shuwei.dish.match.dialog.CommonDialog import com.shuwei.dish.match.dialog.FoodSearchDialog import com.shuwei.dish.match.entity.CookFoodEntity import com.shuwei.dish.match.entity.CookFoodGoodsEntity import com.shuwei.dish.match.entity.FoodRecord -import android.view.ViewGroup -import androidx.activity.addCallback -import androidx.lifecycle.lifecycleScope -import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding import com.shuwei.dish.match.objbox.FoodModule import com.shuwei.dish.match.utils.AddressUtil import com.shuwei.dish.match.utils.CameraUtils import com.shuwei.dish.match.utils.ImageUtil +import com.shuwei.dish.match.utils.KeyboardUtil +import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.SwipeCallback import com.shuwei.dish.match.utils.WeightUtil +import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.roundedDecimalPlace @@ -46,6 +50,9 @@ class PrepareCookActivity : BaseActivity() { companion object { const val TAG = "CookActivity" const val FOOD_ITEM = "foodItem" + const val FOOD_NAME = "foodName" + const val PAGE_FROM = "pageFrom" + const val HOME = "home" const val WEIGHT_CHANGE_VALUE = 5 const val WEIGHT_RECOGNIZE_VALUE = 10 } @@ -56,6 +63,12 @@ class PrepareCookActivity : BaseActivity() { private var food: FoodRecord? = null + /** 采集模式下通过搜索页回填的 foodId */ + private var foodId: String? = null + + /** 来源页面标识,HOME 时返回跳转 SamplingListActivity */ + private var pageFrom: String? = null + private var goodsList: MutableList? = null @Suppress("DEPRECATION") @@ -64,100 +77,104 @@ class PrepareCookActivity : BaseActivity() { binding = ActivityPrepareCookBinding.inflate(layoutInflater) setContentView(binding.root) setHeaderBackground() + pageFrom = intent.getStringExtra(PAGE_FROM) + food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord? + + val isSamplingMode = SpTool.cookMode == 1 + val titleText = if (isSamplingMode) "菜品采集" else "菜品制作" setTitleBar(titleBarAction = { it.visible() }, titleAction = { - it.text = "菜品制作" + it.text = titleText }, rightIconActon = { it.gone() - it.setImageResource(R.drawable.ic_setting) - it.setOnClickListener { - //startActivity() - } }, backAction = { it.setOnClickListener { onBackPressedDispatcher.onBackPressed() } }) - food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord? - binding.tvDishName.text = food?.foodName ?: "" + + // 根据 cookMode 设置搜索栏可编辑性 + if (isSamplingMode) { + // 采集模式:可编辑,支持搜索 + val foodName = intent.getStringExtra(FOOD_NAME) + binding.etInputDish.setText(foodName ?: food?.foodName ?: "") + binding.ivDishSearch.visible() + } else { + // 制作模式:不可编辑,仅展示菜名 + binding.etInputDish.setText(food?.foodName ?: "") + binding.etInputDish.isFocusable = false + binding.etInputDish.isFocusableInTouchMode = false + binding.ivDishSearch.gone() + } + addViewClickListener() addBackKeyListener() - initCamera(binding.flCameraContainer) initRecyclerView() - getDishDetail() + if (!isSamplingMode) { + getDishDetail() + } } private fun addViewClickListener() { WeightUtil.addWeightListener( weightKey = TAG, getWeight = { address, state, weight -> - //Log.d(TAG, "addViewClickListener: address=$address,state=$state,weight=$weight") - if (address == AddressUtil.ONE) { - binding.tvDishPartWeight.text = "${weight}" - if (state == WeightUtil.STATE_STABLE) { + if (address == AddressUtil.ONE && state == WeightUtil.STATE_STABLE) { + runOnUiThread { recognizeFood(weight) } } }) - binding.ivWeightClear.setOnClickListener { - WeightUtil.tareTwo(AddressUtil.ONE) + + if (SpTool.cookMode == 1) { + // 采集模式:绑定搜索栏交互 + binding.ivDishSearch.setOnClickListener { v -> jumpSearch(v) } + binding.etInputDish.addOnActionSearchListener { jumpSearch(binding.etInputDish) } } - binding.ivWeightAdd.setOnClickListener { addWeight() } - binding.tvAddFood.clickWithDebounce { addFood() } + binding.btnCook.clickWithDebounce { - val count = list.count { it.isSetFinished.not() } - if (count > 0) { - showRemindDialog() - return@clickWithDebounce + if (SpTool.cookMode == 1) { + // 采集模式:从输入框创建 FoodRecord + val showFoodName = binding.etInputDish.text.toString().trim() + if (showFoodName.isBlank()) { + toast("菜品名称为空") + return@clickWithDebounce + } + if (list.isEmpty()) { + toast("菜品构成信息未设置") + return@clickWithDebounce + } + val foodRecord = FoodRecord() + binding.etInputDish.let { + if (it.tag != null && it.tag.toString() == it.text.toString()) { + foodRecord.foodId = foodId + } + } + foodRecord.foodName = showFoodName + foodRecord.cookMode = 1 + Log.d(TAG, "goToSubmit: goodsList:${list.toJsonString()}") + startActivity { + putExtra(SubmitFoodActivity.GOODS_LIST, list as Serializable) + putExtra(SubmitFoodActivity.FOOD_ITEM, foodRecord as Serializable) + } + } else { + // 制作模式:检查食材是否全部设置完成 + val count = list.count { it.isSetFinished.not() } + if (count > 0) { + showRemindDialog() + return@clickWithDebounce + } + openSubmitPage() } - openSubmitPage() - } - binding.rgCook.setOnCheckedChangeListener { group, checkedId -> - if (clickIndex < 0 || clickIndex >= list.size) return@setOnCheckedChangeListener - val tempType = - if (checkedId == R.id.rbDishTypeFirst) 1 else if (checkedId == R.id.rbDishTypeSecond) 2 else -1 - list[clickIndex].materialType = tempType - dishPartAdapter.notifyItemChanged(clickIndex) - - binding.tvDishType.text = - if (tempType == 1) "主材" else if (tempType == 2) "辅材" else "" - } - } - - /** - * 添加重量信息到食材数据 - */ - private fun addWeight() { - if (clickIndex == -1) { - toast("请选择菜品构成") - return - } - val clickItem = list[clickIndex] - clickItem.run { - if (isNewDishType && materialType != 1 && materialType != 2) { - toast("请选择主辅材类型") - return - } - } - val weight = binding.tvDishPartWeight.text.toString().toDouble() - if (weight <= 0.toDouble()) { - toast("食材用量需要大于0") - return - } - Log.d(TAG, "addViewClickListener->useRealWeight=$weight") - clickItem.run { - useWeight = weight - isOriginalData = false - isSetFinished = true - dishPartAdapter.notifyItemChanged(clickIndex) } } private val isTakingPhoto = AtomicBoolean(false) private var isRecognizeOpen = false + // 页面可见时允许识别,onPause 后禁止,onResume 后恢复 private var isRecognizeEnabled = true private var lastPhotoUri: Uri? = null @@ -185,33 +202,24 @@ class PrepareCookActivity : BaseActivity() { /** * 菜品选择回调 + * - list 中不含该 goodsId:直接新增,isNewDishType = true + * - list 中已含该 goodsId:累加 useWeight */ - private val foodSelectCallback: (CookFoodGoodsEntity) -> Unit = foodSelectCallback@{ item -> - val filterResult = list.firstOrNull { it.goodsId == item.goodsId } - if (filterResult != null) { - toast("不允许重复添加同一食材") - return@foodSelectCallback + private val foodSelectCallback: (CookFoodGoodsEntity) -> Unit = { item -> + val existing = list.firstOrNull { it.goodsId == item.goodsId } + if (existing != null) { + existing.useWeight = (existing.useWeight ?: 0.0) + (item.useWeight ?: 0.0) + existing.isSetFinished = true + dishPartAdapter.notifyItemChanged(list.indexOf(existing)) + } else { + list.add(item.also { + it.isNewDishType = true + it.isSetFinished = true + }) + val position = list.size - 1 + dishPartAdapter.notifyItemInserted(position) + binding.rvDishPartList.smoothScrollToPosition(position) } - list.add(CookFoodGoodsEntity().apply { - goodsId = item.goodsId - goodsName = item.goodsName -// materialType = - isNewDishType = true - isOriginalData = false - useWeight = lastWeight - isSetFinished = true - }) - val positon = list.size - 1 - dishPartAdapter.notifyItemInserted(positon) - onFoodItemClick(positon) - binding.rvDishPartList.smoothScrollToPosition(positon) - } - - /** - * 添加食材 - */ - private fun addFood() { - FoodSearchDialog(activity = this, onItemSelected = foodSelectCallback).show() } private fun openSubmitPage() { @@ -307,9 +315,12 @@ class PrepareCookActivity : BaseActivity() { private var firstReqSize = 0 private val list = mutableListOf() private val dishPartAdapter by lazy { - DishPartAdapter(list).apply { + DishPartAdapter(list = list).apply { setOnItemClickListener { _, _, positon -> - onFoodItemClick(positon) + list.forEachIndexed { index, entity -> + entity.isItemClicked = index == positon + } + notifyDataSetChanged() } addOnItemChildClickListener(R.id.ivClearIcon) { _, _, positon -> Log.d(TAG, "onFoodItemClick: ${list[positon].toJsonString()}") @@ -327,52 +338,6 @@ class PrepareCookActivity : BaseActivity() { } } - /** - * 菜品列表item点击 - */ - private fun onFoodItemClick(positon: Int) { - this@PrepareCookActivity.clickIndex = positon - list[clickIndex].let { it -> - binding.tvDishShowName.run { - text = it.goodsName - setTypeface(typeface, Typeface.BOLD) - } - - var materialType: String - when (it.materialType) { - 1 -> { - materialType = "主材" - binding.rgCook.check(R.id.rbDishTypeFirst) - } - - 2 -> { - materialType = "辅材" - binding.rgCook.check(R.id.rbDishTypeSecond) - } - - else -> { - materialType = "" - binding.rgCook.clearCheck() - } - } - binding.tvDishType.text = materialType - - list.forEach { bean -> bean.isItemClicked = false } - it.isItemClicked = true - dishPartAdapter.notifyDataSetChanged() - - if (it.isNewDishType) { - binding.dividerDishType.visible() - binding.llDishType.visible() - } else { - binding.dividerDishType.gone() - binding.llDishType.gone() - } - } - } - - private var clickIndex = -1 - /** * RecyclerView初始化 */ @@ -387,14 +352,10 @@ class PrepareCookActivity : BaseActivity() { dishPartAdapter.notifyItemChanged(position) return@SwipeCallback } -// dishPartAdapter.removeAt(position) list.removeAt(position) dishPartAdapter.notifyItemRemoved(position) dishPartAdapter.notifyItemRangeChanged(position, list.size - position) toast("已删除") - if (list.isEmpty()) { - binding.tvDishShowName.text = "" - } }) itemTouchHelper.attachToRecyclerView(this) } @@ -428,10 +389,22 @@ class PrepareCookActivity : BaseActivity() { */ private fun addBackKeyListener() { onBackPressedDispatcher.addCallback(this) { - val count = list.count { !it.isOriginalData } - if (count > 0) { - saveDataRemindDialog() - return@addCallback + if (SpTool.cookMode == 1) { + // 采集模式:有新增食材时提示保存 + if (list.isEmpty().not()) { + saveDataRemindDialog() + return@addCallback + } + if (pageFrom == HOME) { + startActivity() + } + } else { + // 制作模式:有未保存数据时提示 + val count = list.count { !it.isOriginalData } + if (count > 0) { + saveDataRemindDialog() + return@addCallback + } } finish() } @@ -443,9 +416,14 @@ class PrepareCookActivity : BaseActivity() { private fun saveDataRemindDialog() { CommonDialog(this) .setTitle("温馨提示") - .setContent("您好,当前页面存在尚未保存的数据,确认返回吗?") + .setContent("您好,当前页面存在未保存的数据,确认返回吗?") .setNegativeButton("取消") - .setPositiveButton("确认") { finish() } + .setPositiveButton("确认") { + if (SpTool.cookMode == 1 && pageFrom == HOME) { + startActivity() + } + finish() + } .setOnDismissCallback { hideStatusBar() } .show() } @@ -496,12 +474,16 @@ class PrepareCookActivity : BaseActivity() { val foodList = mutableListOf() list.forEachIndexed { index, food -> val foodName = food.name.split("WP").first() - val foodScore = ((1-food.score) * 100).roundedDecimalPlace(2) - foodList.add(CookFoodGoodsEntity( - goodsId = index.toString(), - goodsName = "${foodName}-${foodScore}%", - foodId = index.toString() - )) + foodList.add( + CookFoodGoodsEntity( + goodsId = "${food.id}", + goodsName = foodName, + foodId = index.toString() + ).also { + it.foodScore = ((1 - food.score) * 10000).toInt() + it.isOriginalData = false + } + ) } FoodRecognizeActivity.start( activity = this, @@ -511,7 +493,26 @@ class PrepareCookActivity : BaseActivity() { ) isRecognizeOpen = true isTakingPhoto.set(false) - lastWeight = currentWeight + } + + /** + * 跳转食物搜索页(采集模式专用) + * @param v 触发搜索的 View,用于收起键盘 + */ + private fun jumpSearch(v: View) { + val intent = Intent(this, FoodSearchActivity::class.java).apply { + putExtra(FoodSearchActivity.FOOD_NAME, binding.etInputDish.text.toString().trim()) + } + startActivity(intent) { + foodId = it?.getStringExtra(FoodSearchActivity.FOOD_ID) + val name = it?.getStringExtra(FoodSearchActivity.FOOD_NAME) + binding.etInputDish.run { + setText(name) + tag = name + setSelection(text.length) + } + } + KeyboardUtil.hideKeyboard(v.context, v) } } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt index eae03b0..4eab86a 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt @@ -120,8 +120,8 @@ class SamplingListActivity : BaseActivity() { } return } - startActivity { - putExtra(DishSamplingActivity.FOOD_NAME, item.foodName) + startActivity { + putExtra(PrepareCookActivity.FOOD_NAME, item.foodName) } } @@ -154,7 +154,7 @@ class SamplingListActivity : BaseActivity() { private fun addViewListener() { binding.btnAddSampling.setOnClickListener { judgeDeviceConfig { - startActivity() + startActivity() } } binding.refreshLayout.setOnRefreshListener { diff --git a/app/src/main/res/drawable-xxxhdpi/ic_dish_clear.png b/app/src/main/res/drawable-xxxhdpi/ic_dish_clear.png index 2949eb7f4d9d6c1135cbcd9c73892c9b27aa3d13..abd1bf850ed2c5f22f0a8bed6c156951903caf77 100644 GIT binary patch literal 11111 zcmXw9WmFtZvxa4X#TR#20>Kjq?(Pmjf)gM>kO0A*MT5IL!QEXpkO0Bm-7UE5-S>Rw z{+O9QJyR{yRn=WjJz;7pvRLS3=m-c1Sn_gG8t~`Ye-{V^eizX?h(|yGBgjjMYq}#I z8=`fPYt6i_6=0M@ynnC`7S+)bNEN8LD_#Ong0-y@8ooTL zftiSyN=SZQs`n*^SOQTPMr-l%3(z?BT35uTkM! z(aRjKlPvSiK-K_%h*~oU1UyP>?Y0(F!c6V(t(ssPPxHCC!u7gn-nVxp{W{N%_L^xLdXb)0v9XFmWW z);;+=BJz#JWDAlCC_>G*J>%;Vj`~|)@OQrKu5CZiny>0cD9^fHMCm7c}47%5Gt9jekzt~ei{SIIir$+e-)88H;!xEAz)9tfbbyd2%Y zv}3>dkKJ;uVc*G!l$X)!G$|2j92z0KTcgq&8y)k-5JICLN#xyQWhn@U-x1y=3Mi!) z%$UuajX^~(-+1lsk$M`(IJDfSTWt7SQsVIyz%cnz?LT)0I_01}CJdp{g>>@j*TI z_ug0L2qU~jUw*P=hKQ9a^1Ib!eliZ0#&<1u@Nuy>0vQ|=SXa8!_{8)$R;CZ-i-#A4 z)55^ysX)JEsc0jl%cSw}Io%vWJ~{^L_Ywn{;>%)SA^svb zyDWJJ10x-ARC+$d*6lJh4r7<~R-1dVkxDXixjW+vxZX@A+WDhr(TmmgGSYD<2E!ooD)wxO*FGA5% zs(UYS17(m)*}7x-Wk33cXt51h|F&=sm7WcrUH&RrGFU|7q6+#?J{hAQ=66&Falx?l z$cyuN)5p;DsVVoJZ?dI@S8jOKf#0#@d6OqY8a)|;HUn`ZPkUX+=NKTVe1S*jpx^I{ zo)Yhmz;eSIFKhYS$riqdL!(T(OwyQv&$#v5|HC-k7r z;)HqQV%zBVo$usVBwAB>@kL%`uwwOOYh}`M#IyC)4Xmf#FLCd(F?hc0yO4Sd9gG*> zOnK-Ic~V0@7f;5RL67(3lRFp8vU^v*W6NJ+-q`Yf=7^Y4Ba3s-@)Z$l4d6}q`MqG& ze3-3>ZzA!i^pOR)7RG2ebeV43bnfVc%STBS6*Vg|oZy32IA~uuu3EF#7I{qtjS*Q) zC-%cY^P&mqKaqCWC0{nqDYcu$w;ginILI7ryf-`-iF`8(xT3UGYqXc3IDI5~L)l7o zAm3i|5~4aHZgPnfsJZ`%cSKNU-H1#+U z2wJ~thQ8o;afrm&C;q<=1@U05%1Bu=`i!2t0bYUY?ZB={!ucL8s!3 z&z+-+-LtZhrmcXc#q63@njlnN3dp!8q2!T!B3UnAVrz;`_0;HDxmRp>y0NW?U3>lw zv*Nl!Yj!wYo@4mlE_YSm`mfN7D!+`qra!q}z<~2Yib0B@y@B24UmX)|ybHZO^!_j0 z@f)?mH#6Q%T_B-qAFxJT@ek|R%`bYXk8Ng*zKGaaH%%!af3%UoR?5pgVO4>M*JdHJ z)ICGerMew`?=L6K-`dUKKu4B1n%r;S27G=AieOQlBok8>WA~Ms@?F7oX-f^OGC9UG zpHXWvLHsjh{-SJFl!C(YrCbDL`*Jj!!&+LVo$cgD`K01l{4wdDDuc8$w!jDpq| zWBw=QV~5ffAN@-qT;y~44O(V2h1_P9$<|25bL$1&$nOkLp4~2KqH~gek$6}zc`<`j1aHBg8F(%2yb1Fx6=|#2gsl%$8O_k z5CY%Nc0a50XZszLGLPHawVP~GV7DFHIC44{#~eLV@6e`lerf7&Tq=w?4H$zy~p(I2HsT5zN>s=35C zyZw^$X=R@-1-`1I{eV73qwM-)KX%{YjH>7KFgLrsPNMxs51?h5g>~U4hutmEpTG{3 zZ?}DKecn!P48BOs0nA7mf|oW>9Lg$z;b)n623 zVs3vYqsmxEz)EY1T@?0^+v|0VqN4V-c`3${irp1D+-<3P+ZuRCvcPBum|1rWujAOLpS)0Dq9pxG+T(h=dnHM6>buZM zSv$@J0^;-b6h~j=cD766>^GnXr42Z`lI5OK*M~waR{oPlRG~&zjVt0m#Tf;htoEt@Id`}Q zEek7Jik{32e6RaVAW%p9wRQ6NSQO zCIg8B#{uO>;`eW4frw*Z5}`ApMbAjnG?K5oZ&VboIcCZv*DJC=6^RCiKgW-Gc0OR+ z-8#27kP_0s#tYr_XsM)?d&%tTt6LoxjgLTGSDnN^M@}SH=dqM2RU2QvY~P zd|8pMRrcy>?xREvpEl41JaXda)hNe3C{k#M${Y{(HbPS%)2QAAay}#;x z`g%4DgI2%Bw_Px-@AUKPm?Ba<1q~$F1{s=s^WN1cxwB@K$bpy0Rn^4r+wQ{28Zhbm z?QEbPf7qt16D>G=O%j1BmrphQsdXBriIpF&y9EeZl>xMIhlr}{pS+aJpu5L z3c6IGmwWcsc9^CliDNw)mNrIqaq>;4`KrscB}`lS&DpF4efm>9e=Gp0^4+QCbTS=ini*hMtFxc} z#r!~!>;NsAAg~*jY_z zo3F_LYUoQrT)a6@U;F&6}R)hPmNh`w4Xg%0CyuJ%7U!saY^{VD=}6>Wuv4}r>W)4 zllMc;ITCH%y?Y`r14R%ud7#9(rPYf_xHR)CZY3vRuc&pzxmhwN(G!rD7C~Vx?2M!om4*9hi(OI5t`}|SP)ZqGf(Z0(Et$H1^-Pm(IN1NS(*Prd<_&SQ8U4{i zgU%sIyK)Hu-i0OE{##%h zK0nLk*&JDBgF52(-KevSN73U)9aciYFwDnStzgywFJ8OzFViuKaE3vG>Ni}nDzA^8byc`Kg-_9K85jSMzweWVRi}L7ey{(u6!Qno z*82E@{{dR7{x_`2nXj0YIzTLthF$1|LjTG>yuLs^(XS8<)9!Y4FLLZ8daJ@iLl0cS z0Hks~uIN!|@jG6Z@GL~DnEn==7;$VIj9V*8#Q#1N2&I>TT{uo6`2A98;DY}1Tqjg^ zcP;oEAm#}47HO9^G~Q5Y;Da`5Us>sdPiejaT^CK6*g%O=5VIkSAu2xM+FVn0R zYx-FD9{RNInG<{h#HMI->s_<-dHgK(GGT3J>#gfyvFG;UR@?p%1S~-S@xBrUeoMU% zQcoxDAKki$^Q;+~LS(3?v`OPyG)&hvt@>{;TI4Oy-(t1zIU3bTthC5LsGfB0q%WoL zR`+r69AA~p=Phr6V6@DU>ew;4Y9EE}IU9W*Afk9KF93a%Ki_2)yOAB*_!i3f@VvS@ zm<)k{uEb&d(72qKV6=)l57M>%xNF{|vA)*pf0{O`0+ZpI&gdE&#l~pE>BKliGw!el&E6AUcud*kR7XqfYi>(K%Mu|zD2QbN*ByRLF&G6uorIehcdY@4F65K=t|e$X;ryRD!*=+B-ox%p zeRrZ=X54Wy)4>6=413;5F(^_H^73aHrad#0J(`9c68Ckzy-_WE$E=0=^ci_WEg9Gg zn?w0tNt1_0LQc$T==hSY))G*=Y~Rb(ZY+O)1{0wFhP3GsSEVuCn48UTbhuQRDvpQxL3%_6(uCUGaL<-9ZLV zVa2EuoxHnf(K?S!Pyc26QbzD}Tl3{d3kZ72vh7qnC-UX~sU;;2-5ws&X||wzSYre2 zPk~dO@RL#Xqk7zkMERYpjJ1lTk_p9QgegfZv}1j%(sQEE=3TyvCvDHIP^tRi*%&n z6!rjl3X{ISBym*^Jqr?j4E*t*qh*|jd;fcHF+v6h#6s^7k%i(jO(3=s+kp2^ z1GVE54&;%)aO`xTIl|pr6=Me!H6DkneCMBjXRe=8b>+`u~ zcw@5=!1CPT11)k4)7l&cRRU6gSUqH%bQM=&K`4o7@saFqkk-LwlZo+Zh>;JkG8h(( zkkEq_CML5Wolo}GSi_hKidCkob@9z4{5lTl+~f+w=jLzGe``JOYOWxvhhB1l7J2-d z#F2b^N7k^ta_U~p2!d~h{u(^^pQ_))eljZivxDCf*)G01NFcMj!X}6ewGe~wZ-9BG zcF8{}mg;aMsjjaN_kaCIO%N*Yhf#{=#itp+86ai`$*o&!u$B9JwlM!L2UgS|p(~?2 zVU*u+)zgU(7gZ!K_A45u_nb!&nTbonSgt?zu@=mS!?<%AAMX+-#>@dA^Afl*{ERG7 zTPL6x3cOiCWxQ-|NuWE?7joV|qJ(&SF008o-xO8ARwh7{`xuKO*IYj37#emb z`BsHdv`8v8q^M759@K};pn6a8i3m6- zo$EBYr#t=LTibU^T%)sNI}_Gdr4h~ifti1T5AW~UMr(&R2oM!6R%C;jvFqJZG7eq8 zDlXM`t)q2-_)-sRx-HCHF_uh!6>g$~D=iTK$FPQ})iLDD&l9IIOWAdUcRQ*sd*OZ$ zAJRL|PGY6OR#HHbLxI3C-|p>>ue;|J9!g6e>z!ATp+h-`CtH0GIksg~yaihjut7VM z8Xn(EJKeeS+@{W^l?g-Ji`%H3v{x7kWz7z@$9(Jli(zoVa}Mc zlogi#9Anra_fJZjumFhK5Qs7J^Io#^M9wtm8* z#%$ODFXPU)WNfS;xi6SgMkE`}f3V0`^8(S)_Dkf=41SP)q41jV(r(lIuDXuvcsc3T zF8HHIT`qX6h#GEf4^sc-&Hf55jCx#?#nx_(_7k=-)O^^s1evUUwz-IwR+bT{%QE9u z2Lr7Up~Hhr&b=p<3E{nC>q;4Ggf)XF+gMQjst1Ptp6-2~gF7dNLozT0OSl9g(A>=h zEEgJzaO`i=*b#{6tJ7IsIztX1SG4iqo$yThD?sc*HMv2Xc@!1`8P5UTDeZT}C83h> zZq*#H=^osuT|~oVhYb)N#ITp%qJ~t~?V|x^q#=~g?`iw--?11*RJ7Ngwt05aI*jIH z0BnRY5B71KEVd=VC0~HaN(bs^fojZKUvIRwQ7Wf z;<@M`)@YPm+}i3eN`s-uy?@tUHlC^`obR#=6FQHW{1i6`LMAPfsv&QYq0BTUMw%%j zO-pk{RQdH3w)Ck2*&iqUL1%OQvvr~?+ zC>y((%LAL9_`ygQ(5&ni=0@cf=-Pd%z=~;aHpMrA3pAh| ze_jc~H<{qm($ejb4{IrBa&`K<*}ic8TEK z^>-2NG)Q4&XSiX-SbJWJS#RWr7{_;(T$O+f=>vJtuHJ^3HG~4Q2PEgt{9tuvDzlTQI?7{(ZHG2DZ){3xKMrW_< z=jIz-0-OKVs95a~^~BrUIW2-?Mb|NZMHIN-CE1GcfuKqJA&WSROM4I<;DIX_(hqnD z=;+Tp)|?@|y>Tw}1KA1zefdzF)KSCEXHyo zJv(UxUcFD%)KzwoU@XM#%#q3D$f=kN4;C~ zz|Kk#Ih~9y;bn$olvh^H_!^)~IO|Xw)Tip3zFks;)|EOL4&YouqXS zRn_s2?^`rAd;-D3r&z08N?E;*)x=wtIwvhOHRa)#%%Pj1NQbHp-L|OaDI5hN)16GU z<6uz1o2j^&UAImuE?MIMlVd+&_U%O}JKTA$z24jIz8OEJZ&O5EHK5&`t<<>b-*A_? z%cex{9_SxVlX_Rn+qA4-Dh#0Z*6j#xO)C)@KzK&2WgN!vbRCC(^mP6-( zl+9Ou*TF~P^eFsQ)!^W30S}t35a#F|ej=H5UG|S2$4nn38bXm7Brnr^ZCtsiwRGGR zw6tpED~s%w(i#%z-Ff!>#k|}AzuoqC|_{)D%#0W0r8gW24?;waZD%k)2d&ouc z9arzq*t9doVH%IlgFjzKk2IHnJe8DGe%OYd`q_!x7E`pOG4JAj=b!fq)iGE+ki&<_ zano}9VesN41n1c-{`TtSn_lgMO%AN@5jSkE_UoMXa8<5*0#``Ssp5A7itE1IPY1-n z_=#r{^_8(UwmkO~u0DsR1^tXwkK3@q2S|zHqgXd`%3WQ6T_gb9Pk*bOqmHO=|q`L0h~6HDjG#iKl_wcj>ZF_R3_ zk0@Ctgf5#Ipzh?uKL-`&s{=+J7-|qpxmU#j%@>=fcAbWwih-Mt4{T?-P+n(i;PGf%o+S;zkp!p@P89Px1=`3xBu zVYHGVL<+G|Tk9IQ=%*;fb(eQoj>&D0mSHC^Xr@`6lSltZ(X){Xef!7H#=Nt=U8a1M zoj$vhH@&hB3ZLC;i_ys3g?ucFTQ&J45_b8<&MFt)jzg5H$&~43{cn>ezHBv>?;E7` z<;?lDE# zHJSeVrF1+OrqVOs`QDePkQyh~5A(eN0exFMPo!w=rWI&jQPEsGd)%K(svjM@u&{X^MZJYGu8#^m_Oa(M6 z7H4tV5MI1>m}ypS!Qu|NUIhdfpFaqe%g3h35nNh~EYRKECu*~TP6s%W6o*Ese!#;^ znp*=NZ``BqB;O}!T|CXXjapekk}(SMWpcRnZB0d+y~YR3NlDyDx{ z+A**DQBEkNoZe}!JW)?UFrKk8@iOm2MjZ$#iRRiG@9=B94ep#94dDy2MqC=^7e9#) z8^^73p|bx0M*{hXyD=sU>T=Ruq2_#%&fBJ`uf574)mvTs!()3QQ$M@>lgO*Z=`S(& zFzyVrpMzXt=pm>YJU^#ZCKsRHd?g8}MI%Xe?{uXouVRoe3A`;4HX?k}y<>9EZ8BOSIQ^i7;bFw$ps66vj=m)y6Co=qP5CU+vi#_}{N$V5@D zkcVIWA63j=^p}ZEd@aNK|C%|GU7GZ@=KZb(^`&^)cAgC1AC7J*2rTnFuffrf&#-hF zH4#n`pR)LwFgsKbV=AvX=GHxb=|W%YA2mF{o@DV(+bwSD2Xg2pZ`W681^nn*{^wRV^MKvE>z78ZM7Gseq_$!|B8v2^5c@*qzM;nWAw zOwjM*v(06UU5~d8{1F*{t8rSsH8lhTJtH$9j0GGnM$ue2va>1SsBkA}j)X`{FY31g ztK^)@ZKu82=DbfAm3+TE>C=`+1FkfUrg0_{8WUv{+3Lib#gCkvdc#e;dGV5k?Kbz| z=TB%qokyfUc-~A5Bi$zB1yRrJ)@j(AhV8KTeAXhP#ulWutFNx8mNPWuf8R$uD#de2 zcvI7^CgY^!B|KaMsM92abMy*v-<$ivb2>)Ha4SoRoerfT(K&9tS)ae>D>L}r=y9;f zv1_y8IJ0)pFY!PSs$t0~is`$iedQqwG+PsA_r=$FA^fkZt-LJmmYah^WQOQob)K|RAM-F@6WVbg;n&9v;I4_G%=8x$Ab1r36Ba`&s zdDC%n)W(~8C(%7Ap0NDbB^KtcS&R*dx+1J;{$J|DE0p-8*FcJbk X=0p-RWm5yZ20>n0MXE}|B;fx5Yvg3K literal 12079 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 - - - - + android:gravity="center_vertical" + android:orientation="horizontal"> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -237,17 +75,6 @@ android:textColor="@color/black666" android:textSize="28sp" /> - - @@ -18,4 +18,18 @@ android:ellipsize="end" android:background="@drawable/shape_white_12_corners"/> - \ No newline at end of file + + + + \ No newline at end of file