From b110cc97a0a92cc8c0f7b2a60683a1672ecd9edc Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Mon, 27 Apr 2026 10:21:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor(collect):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A3=9F=E6=9D=90=E9=87=87=E9=9B=86=E5=8A=9F=E8=83=BD=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=92=8C=E9=80=82=E9=85=8D=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将按钮组件替换为TextView以支持更好的交互效果 - 添加selectableItemBackground实现点击反馈效果 - 重命名食材采样为食材采集保持术语一致性 - 替换FoodCollectionAdapter为VectorCollectionAdapter适配器 - 更新列表项布局从list_item_food_collection到list_item_vector_collection - 添加FoodSearchAdapter适配器用于食材搜索功能 - 重构CollectFragment中的数据绑定和UI逻辑 - 修改相机容器布局位置优化界面结构 - 更新资源文件名和颜色定义提升代码可读性 - 调整保存按钮样式增强视觉效果 - 修改提示对话框内容精确表达功能意图 --- .../dish/match/adapter/FoodSearchAdapter.kt | 43 +++++++++ ...nAdapter.kt => VectorCollectionAdapter.kt} | 10 +- .../dish/match/ui/PrepareCookActivity.kt | 4 +- .../shuwei/dish/match/ui/SettingActivity.kt | 2 +- .../dish/match/ui/SingleFragmentActivity.kt | 2 +- .../dish/match/ui/fragment/CollectFragment.kt | 91 +++++++++++-------- app/src/main/res/color/color_item_search.xml | 5 + .../{bg_text_main.xml => bg_item_search.xml} | 6 +- .../res/layout/activity_dish_sampling.xml | 3 +- .../res/layout/activity_food_recognize.xml | 2 + .../main/res/layout/activity_prepare_cook.xml | 13 +-- app/src/main/res/layout/activity_setting.xml | 2 +- .../main/res/layout/activity_submit_food.xml | 6 +- app/src/main/res/layout/fragment_collect.xml | 14 ++- .../main/res/layout/list_item_search_food.xml | 6 +- ...on.xml => list_item_vector_collection.xml} | 0 16 files changed, 141 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/com/shuwei/dish/match/adapter/FoodSearchAdapter.kt rename app/src/main/java/com/shuwei/dish/match/adapter/{FoodCollectionAdapter.kt => VectorCollectionAdapter.kt} (82%) create mode 100644 app/src/main/res/color/color_item_search.xml rename app/src/main/res/drawable/{bg_text_main.xml => bg_item_search.xml} (71%) rename app/src/main/res/layout/{list_item_food_collection.xml => list_item_vector_collection.xml} (100%) diff --git a/app/src/main/java/com/shuwei/dish/match/adapter/FoodSearchAdapter.kt b/app/src/main/java/com/shuwei/dish/match/adapter/FoodSearchAdapter.kt new file mode 100644 index 0000000..4564009 --- /dev/null +++ b/app/src/main/java/com/shuwei/dish/match/adapter/FoodSearchAdapter.kt @@ -0,0 +1,43 @@ +package com.shuwei.dish.match.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import com.chad.library.adapter4.BaseQuickAdapter +import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.shuwei.dish.match.R +import com.shuwei.dish.match.databinding.ListItemSearchFoodBinding +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 FoodSearchAdapter(private var list: MutableList) : + BaseQuickAdapter(list) { + + override fun onBindViewHolder( + holder: VH, + position: Int, + item: CookFoodGoodsEntity? + ) { + item ?: return + holder.binding.tvFoodName.run { + text = item.goodsName + isChecked = item.isClicked + } + } + + override fun onCreateViewHolder( + context: Context, + parent: ViewGroup, + viewType: Int + ): VH { + val binding = ListItemSearchFoodBinding.inflate(LayoutInflater.from(context), parent, false) + return VH(binding) + } + + inner class VH(var binding: ListItemSearchFoodBinding) : QuickViewHolder(binding.root) + +} \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/adapter/FoodCollectionAdapter.kt b/app/src/main/java/com/shuwei/dish/match/adapter/VectorCollectionAdapter.kt similarity index 82% rename from app/src/main/java/com/shuwei/dish/match/adapter/FoodCollectionAdapter.kt rename to app/src/main/java/com/shuwei/dish/match/adapter/VectorCollectionAdapter.kt index a095f5a..e3283a8 100644 --- a/app/src/main/java/com/shuwei/dish/match/adapter/FoodCollectionAdapter.kt +++ b/app/src/main/java/com/shuwei/dish/match/adapter/VectorCollectionAdapter.kt @@ -8,18 +8,18 @@ import android.widget.ImageView import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.shuwei.dish.match.R -import com.shuwei.dish.match.databinding.ListItemFoodCollectionBinding +import com.shuwei.dish.match.databinding.ListItemVectorCollectionBinding import com.shuwei.dish.match.objbox.FoodCollectionBean import com.shuwei.dish.match.utils.ext.load -class FoodCollectionAdapter (var list: MutableList) : - BaseQuickAdapter(list) { +class VectorCollectionAdapter (var list: MutableList) : + BaseQuickAdapter(list) { - inner class VH(var binding: ListItemFoodCollectionBinding) : QuickViewHolder(binding.root) + inner class VH(var binding: ListItemVectorCollectionBinding) : QuickViewHolder(binding.root) override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { val inflater = LayoutInflater.from(context) - val binding = ListItemFoodCollectionBinding.inflate(inflater, parent, false) + val binding = ListItemVectorCollectionBinding.inflate(inflater, parent, false) return VH(binding) } 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 5b03a28..c801e10 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 @@ -265,8 +265,8 @@ class PrepareCookActivity : BaseActivity() { private fun showRemindDialog() { CommonDialog(this) - .setTitle("制作提示") - .setContent(getString(R.string.food_remind_01)) + .setTitle(getString(R.string.food_remind_01)) + .setContent(getString(R.string.food_remind_02)) .setNegativeButton("返回调整") .setPositiveButton("确认无误") { openSubmitPage() } .setOnDismissCallback { hideStatusBar() } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt index b58e40a..194e71e 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt @@ -116,7 +116,7 @@ class SettingActivity : BaseActivity() { private fun showNotGrantedCameraPermissionDialog() { CommonDialog(this) .setTitle("温馨提示") - .setContent("暂无相机权限,无法使用菜品采集功能,请确认是否同意开始权限?") + .setContent("暂无相机权限,无法使用食材采集功能,请确认是否同意开始权限?") .setNegativeButton("不同意") .setPositiveButton("同意") { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SingleFragmentActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SingleFragmentActivity.kt index 0e7268a..e1dccac 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SingleFragmentActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SingleFragmentActivity.kt @@ -94,7 +94,7 @@ class SingleFragmentActivity : BaseActivity() { * 根据页面类型返回对应标题文本 */ private fun getTitleForPage(pageType: PageType): String = when (pageType) { - PageType.FOOD_COLLECT -> "食材采样" + PageType.FOOD_COLLECT -> "食材采集" PageType.COOK_MODE -> "餐品模式" PageType.SEASONING_CONFIG -> "调料区设置" } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt b/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt index 92350f4..f84d304 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/fragment/CollectFragment.kt @@ -16,11 +16,13 @@ import androidx.core.view.doOnLayout import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.GridLayoutManager import com.shuwei.dish.match.R -import com.shuwei.dish.match.adapter.FoodCollectionAdapter +import com.shuwei.dish.match.adapter.VectorCollectionAdapter +import com.shuwei.dish.match.adapter.FoodSearchAdapter import com.shuwei.dish.match.base.BaseFragment import com.shuwei.dish.match.databinding.FragmentCollectBinding import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding import com.shuwei.dish.match.dialog.Loading +import com.shuwei.dish.match.entity.CookFoodGoodsEntity import com.shuwei.dish.match.objbox.FoodCollectionBean import com.shuwei.dish.match.objbox.FoodModule import com.shuwei.dish.match.ui.CollectedFoodActivity @@ -35,7 +37,7 @@ import com.shuwei.dish.match.utils.ext.dp import com.shuwei.dish.match.utils.ext.toast @SuppressLint("NotifyDataSetChanged") -class CollectFragment : BaseFragment(){ +class CollectFragment : BaseFragment() { companion object { private const val TAG = "CollectFragment" @@ -45,34 +47,47 @@ class CollectFragment : BaseFragment(){ private var selectedFoodId: String? = "" private var selectedFoodName: String? = "" - private val foodCollectionList = mutableListOf().apply { + private val vectorList = mutableListOf().apply { repeat(MAX_COUNT) { add(FoodCollectionBean(isShowCamera = true)) } } - // private val searchFoodList = mutableListOf() -// private var settingActivity: SettingActivity? = null -// private var checkedItem: FoodInfo? = null -// private val searchFoodAdapter by lazy { -// CollectFoodListAdapter(searchFoodList).apply { -// setOnItemClickListener { adapter, view, position -> -// searchFoodList.forEachIndexed { index, item -> item.isChecked = index == position } -// checkedItem = searchFoodList[position] -// notifyDataSetChanged() -// selectedFoodId = checkedItem!!.foodId -// selectedFoodName = checkedItem!!.foodName -// } -// } -// } + private val searchList = mutableListOf().apply { + add(CookFoodGoodsEntity(goodsId = "200001", goodsName = "土豆丝")) + add(CookFoodGoodsEntity(goodsId = "200002", goodsName = "土豆片")) + add(CookFoodGoodsEntity(goodsId = "200003", goodsName = "土豆丁")) + add(CookFoodGoodsEntity(goodsId = "200004", goodsName = "胡萝卜丝")) + add(CookFoodGoodsEntity(goodsId = "200005", goodsName = "胡萝卜片")) + add(CookFoodGoodsEntity(goodsId = "200006", goodsName = "胡萝卜丁")) + add(CookFoodGoodsEntity(goodsId = "200007", goodsName = "黄瓜丝")) + add(CookFoodGoodsEntity(goodsId = "200008", goodsName = "黄瓜片")) + add(CookFoodGoodsEntity(goodsId = "200009", goodsName = "黄瓜丁")) + add(CookFoodGoodsEntity(goodsId = "200010", goodsName = "洋葱丝")) + add(CookFoodGoodsEntity(goodsId = "200011", goodsName = "洋葱丁")) + } + private var checkedItem: CookFoodGoodsEntity? = null + private val searchAdapter by lazy { + FoodSearchAdapter(searchList).apply { + setOnItemClickListener { adapter, view, position -> + searchList.forEachIndexed { index, item -> item.isClicked = index == position } + checkedItem = searchList[position] + notifyDataSetChanged() + checkedItem?.let { + selectedFoodId = it.foodId + selectedFoodName = it.goodsName + } + } + } + } private val debouncer = Debouncer(2000) -// private lateinit var settingActivity: SettingActivity + private lateinit var currentActivity: SingleFragmentActivity - private val collectionAdapter: FoodCollectionAdapter by lazy { - FoodCollectionAdapter(foodCollectionList).apply { + private val vectorAdapter: VectorCollectionAdapter by lazy { + VectorCollectionAdapter(vectorList).apply { addOnItemChildClickListener(R.id.ivDelete) { _, _, position -> - foodCollectionList[position].let { + vectorList[position].let { it.bitmap = null it.imageVector = null it.imageFile = null @@ -96,23 +111,23 @@ class CollectFragment : BaseFragment(){ //typealias CameraCallback = (Uri) -> Unit - private val cameraCallback: (Uri) -> Unit = { uri -> + private val cameraCallback: (Uri) -> Unit = cameraCallback@{ uri -> try { - val index = foodCollectionList.indexOfFirst { it.imageFile == null } + val index = vectorList.indexOfFirst { it.imageFile == null } if (index == -1) { toast("每次只允许保存${MAX_COUNT}条数据") hideWaitingDialog() - rerurn@ cameraCallback + return@cameraCallback } activity?.runOnUiThread { - foodCollectionList[index].let { + vectorList[index].let { it.imageVector = null it.bitmap = null it.isShowCamera = false it.imageFile = null it.imageUri = uri } - collectionAdapter.notifyItemChanged(index) + vectorAdapter.notifyItemChanged(index) } // hideWaitingDialog() Thread { @@ -149,13 +164,13 @@ class CollectFragment : BaseFragment(){ log("${this.javaClass.simpleName}-cameraCallback-裁剪bitmap保存文件路径:${file?.absolutePath}") activity?.runOnUiThread { - foodCollectionList[index].let { + vectorList[index].let { it.imageVector = imageVector it.bitmap = null it.isShowCamera = false it.imageFile = file } - collectionAdapter.notifyItemChanged(index) + vectorAdapter.notifyItemChanged(index) } if (bitmap.isRecycled.not()) { bitmap.recycle() @@ -165,12 +180,12 @@ class CollectFragment : BaseFragment(){ @SuppressLint("NotifyDataSetChanged") private fun takePhoto() { - val count = foodCollectionList.count { it.bitmap != null } + val count = vectorList.count { it.bitmap != null } if (count >= MAX_COUNT) { toast("每次只允许保存${MAX_COUNT}条数据") return } - val index = foodCollectionList.indexOfFirst { it.imageFile == null } + val index = vectorList.indexOfFirst { it.imageFile == null } if (index == -1) { toast("每次只允许保存${MAX_COUNT}条数据") hideWaitingDialog() @@ -212,7 +227,7 @@ class CollectFragment : BaseFragment(){ binding.rvFoodList.let { it.layoutManager = GridLayoutManager(requireActivity(), 3, GridLayoutManager.VERTICAL, false) - it.adapter = collectionAdapter + it.adapter = vectorAdapter } binding.btnFoodSearch.setOnClickListener { @@ -248,7 +263,7 @@ class CollectFragment : BaseFragment(){ startActivity(Intent(requireActivity(), CollectedFoodActivity::class.java)) } binding.btnTakePhoto.clickWithDebounce { - val count = foodCollectionList.count { it.bitmap != null } + val count = vectorList.count { it.bitmap != null } if (count >= MAX_COUNT) { toast("每次只允许保存${MAX_COUNT}条数据") return@clickWithDebounce @@ -256,10 +271,10 @@ class CollectFragment : BaseFragment(){ takePhoto() } binding.btnClearData.setOnClickListener { clearData() } -// binding.rvSearchFood.let { -// it.layoutManager = GridLayoutManager(context, 2) -// it.adapter = searchFoodAdapter -// } + binding.rvSearchFood.let { + it.layoutManager = GridLayoutManager(context, 2) + it.adapter = searchAdapter + } searchFood() } @@ -342,7 +357,7 @@ class CollectFragment : BaseFragment(){ @SuppressLint("NotifyDataSetChanged") fun clearData() { - foodCollectionList.forEach { + vectorList.forEach { it.bitmap = null it.imageVector = null it.imageFile = null @@ -351,7 +366,7 @@ class CollectFragment : BaseFragment(){ it.isFinish = false it.uploadSuccess = false } - collectionAdapter.notifyDataSetChanged() + vectorAdapter.notifyDataSetChanged() clickIndex = -1 binding.editFoodName.setText("") diff --git a/app/src/main/res/color/color_item_search.xml b/app/src/main/res/color/color_item_search.xml new file mode 100644 index 0000000..2489de6 --- /dev/null +++ b/app/src/main/res/color/color_item_search.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_main.xml b/app/src/main/res/drawable/bg_item_search.xml similarity index 71% rename from app/src/main/res/drawable/bg_text_main.xml rename to app/src/main/res/drawable/bg_item_search.xml index 1911b73..edc87a5 100644 --- a/app/src/main/res/drawable/bg_text_main.xml +++ b/app/src/main/res/drawable/bg_item_search.xml @@ -4,14 +4,14 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dish_sampling.xml b/app/src/main/res/layout/activity_dish_sampling.xml index 88664a6..7b72f2f 100644 --- a/app/src/main/res/layout/activity_dish_sampling.xml +++ b/app/src/main/res/layout/activity_dish_sampling.xml @@ -271,7 +271,7 @@ - diff --git a/app/src/main/res/layout/activity_food_recognize.xml b/app/src/main/res/layout/activity_food_recognize.xml index 8f5b455..8a70217 100644 --- a/app/src/main/res/layout/activity_food_recognize.xml +++ b/app/src/main/res/layout/activity_food_recognize.xml @@ -65,6 +65,7 @@ android:layout_marginTop="30dp" android:gravity="center" android:background="@drawable/shape_green_bg" + android:foreground="?android:attr/selectableItemBackground" android:text="更换食材" android:textColor="@color/white" android:textSize="32sp" @@ -79,6 +80,7 @@ android:layout_marginBottom="30dp" android:gravity="center" android:background="@drawable/shape_white_12_corners" + android:foreground="?android:attr/selectableItemBackground" android:text="取消" android:textColor="@color/black333" android:textSize="32sp" diff --git a/app/src/main/res/layout/activity_prepare_cook.xml b/app/src/main/res/layout/activity_prepare_cook.xml index f4d268f..fa0c546 100644 --- a/app/src/main/res/layout/activity_prepare_cook.xml +++ b/app/src/main/res/layout/activity_prepare_cook.xml @@ -75,6 +75,11 @@ android:textColor="@color/black666" android:textSize="28sp" /> + + - - - - - + tools:listitem="@layout/list_item_vector_collection" /> @@ -157,9 +157,9 @@ android:layout_height="match_parent" android:background="@drawable/setting_border_gray3" android:gravity="center_vertical" - android:hint="输入菜品名称" - android:inputType="text" + android:hint="输入食材名称" android:imeOptions="actionSearch" + android:inputType="text" android:maxLines="1" android:paddingStart="47dp" android:paddingEnd="80dp" @@ -191,7 +191,7 @@ app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" tools:listitem="@layout/list_item_search_food"/> - + android:textSize="40sp" + android:clipToOutline="true"/> \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_search_food.xml b/app/src/main/res/layout/list_item_search_food.xml index e988ecd..6999911 100644 --- a/app/src/main/res/layout/list_item_search_food.xml +++ b/app/src/main/res/layout/list_item_search_food.xml @@ -4,7 +4,7 @@ android:id="@+id/tvFoodName" android:layout_width="match_parent" android:layout_height="100dp" - tools:background="@drawable/bg_text_main" + android:background="@drawable/bg_item_search" android:ellipsize="end" android:gravity="center" android:maxLines="1" @@ -12,7 +12,7 @@ android:layout_marginVertical="14dp" android:paddingHorizontal="15dp" android:textAlignment="center" - tools:textColor="@color/black" + android:textColor="@color/color_item_search" android:textSize="30sp" android:textStyle="bold" - tools:text="肉沫干拌面" /> \ No newline at end of file + tools:text="土豆丝" /> \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_food_collection.xml b/app/src/main/res/layout/list_item_vector_collection.xml similarity index 100% rename from app/src/main/res/layout/list_item_food_collection.xml rename to app/src/main/res/layout/list_item_vector_collection.xml