From c38bead8a384b2f914b4fb7b59397de32fd18fe0 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Tue, 13 Jan 2026 09:30:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sw/dualscreen/activity/MainActivity.kt | 9 ++-- .../activity/fragment/CollectFragment.kt | 6 +-- .../adapter/CollectFoodListAdapter.kt | 41 +++++++++++++++++++ .../adapter/DialogSearchFoodAdapter.kt | 38 +++++++++++++++++ ...hFoodAdapter.kt => MainFoodListAdapter.kt} | 13 +++++- .../com/sw/dualscreen/network/ApiClient.kt | 2 - .../presentation/MainScreenPresentation.kt | 16 +++++--- .../view/CustomBottomSheetDialog.kt | 6 +-- app/src/main/res/color/color_search_food.xml | 5 --- app/src/main/res/color/color_text_dialog.xml | 5 +++ ...bg_search_food.xml => bg_text_collect.xml} | 6 +-- app/src/main/res/drawable/bg_text_dialog.xml | 17 ++++++++ app/src/main/res/drawable/bg_text_main.xml | 17 ++++++++ app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/bottom_sheet_dialog.xml | 9 ++-- .../main/res/layout/item_user_nutrition.xml | 4 +- .../main/res/layout/list_item_search_food.xml | 6 +-- .../res/layout/list_item_search_food2.xml | 18 ++++++++ 18 files changed, 180 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/sw/dualscreen/adapter/CollectFoodListAdapter.kt create mode 100644 app/src/main/java/com/sw/dualscreen/adapter/DialogSearchFoodAdapter.kt rename app/src/main/java/com/sw/dualscreen/adapter/{SearchFoodAdapter.kt => MainFoodListAdapter.kt} (74%) delete mode 100644 app/src/main/res/color/color_search_food.xml create mode 100644 app/src/main/res/color/color_text_dialog.xml rename app/src/main/res/drawable/{bg_search_food.xml => bg_text_collect.xml} (78%) create mode 100644 app/src/main/res/drawable/bg_text_dialog.xml create mode 100644 app/src/main/res/drawable/bg_text_main.xml create mode 100644 app/src/main/res/layout/list_item_search_food2.xml diff --git a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt index 9bf61d9..d4c7829 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt @@ -25,8 +25,8 @@ import androidx.recyclerview.widget.GridLayoutManager import com.google.common.util.concurrent.ListenableFuture import com.sw.dualscreen.GlobalData import com.sw.dualscreen.GlobalKey -import com.sw.dualscreen.activity.fragment.CollectFragment -import com.sw.dualscreen.adapter.SearchFoodAdapter +import com.sw.dualscreen.adapter.DialogSearchFoodAdapter +import com.sw.dualscreen.adapter.MainFoodListAdapter import com.sw.dualscreen.databinding.ActivityMainBinding import com.sw.dualscreen.dialog.RemindDialog import com.sw.dualscreen.ext.dp @@ -38,7 +38,6 @@ import com.sw.dualscreen.model.response.ClickBackEvent import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.model.response.FoodOrder import com.sw.dualscreen.model.response.PaySuccessEvent -import com.sw.dualscreen.model.response.ResetBoxEvent import com.sw.dualscreen.model.response.UserFaceModel import com.sw.dualscreen.objbox.Food import com.sw.dualscreen.objbox.FoodModule @@ -80,7 +79,6 @@ import java.time.ZoneId import java.time.format.DateTimeFormatter import java.util.Locale import java.util.concurrent.Executors -import kotlin.collections.get import kotlin.math.roundToInt /** @@ -104,7 +102,7 @@ class MainActivity : BaseActivity() { private val handler by lazy { Handler(Looper.getMainLooper()) } private val searchFoodList = mutableListOf() private val adapter by lazy { - SearchFoodAdapter(searchFoodList).apply { + MainFoodListAdapter(searchFoodList).apply { setOnItemClickListener { adapter, view, position -> if (searchFoodList[position].isChecked) { return@setOnItemClickListener @@ -122,6 +120,7 @@ class MainActivity : BaseActivity() { val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) //不计费模式切换菜品,重新加载数据 if (mode == 1) { + presentation?.isAgainLoadData = false presentation?.loadUnbilledMode() } } diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt index 1c171f6..e5e1a59 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt @@ -17,8 +17,9 @@ import com.sw.dualscreen.GlobalData import com.sw.dualscreen.R import com.sw.dualscreen.activity.CollectedFoodActivity import com.sw.dualscreen.activity.SettingActivity +import com.sw.dualscreen.adapter.CollectFoodListAdapter import com.sw.dualscreen.adapter.FoodCollectionAdapter -import com.sw.dualscreen.adapter.SearchFoodAdapter +import com.sw.dualscreen.adapter.DialogSearchFoodAdapter import com.sw.dualscreen.databinding.FragmentCollectBinding import com.sw.dualscreen.databinding.LayoutCameraPreviewBinding import com.sw.dualscreen.ext.clickWithDebounce @@ -28,7 +29,6 @@ import com.sw.dualscreen.objbox.Food import com.sw.dualscreen.objbox.FoodCollectionBean import com.sw.dualscreen.objbox.FoodModule import com.sw.dualscreen.objbox.ObjectBox -import com.sw.dualscreen.utils.BitmapCropper import com.sw.dualscreen.utils.BitmapSaver import com.sw.dualscreen.utils.CameraUtils import com.sw.dualscreen.utils.Debouncer @@ -72,7 +72,7 @@ class CollectFragment : BaseFragment() { private var settingActivity: SettingActivity? = null private var checkedItem: FoodInfo? = null private val searchFoodAdapter by lazy { - SearchFoodAdapter(searchFoodList).apply { + CollectFoodListAdapter(searchFoodList).apply { setOnItemClickListener { adapter, view, position -> searchFoodList.forEachIndexed { index, item -> item.isChecked = index == position } checkedItem = searchFoodList[position] diff --git a/app/src/main/java/com/sw/dualscreen/adapter/CollectFoodListAdapter.kt b/app/src/main/java/com/sw/dualscreen/adapter/CollectFoodListAdapter.kt new file mode 100644 index 0000000..aa00bc3 --- /dev/null +++ b/app/src/main/java/com/sw/dualscreen/adapter/CollectFoodListAdapter.kt @@ -0,0 +1,41 @@ +package com.sw.dualscreen.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.graphics.toColorInt +import com.chad.library.adapter4.BaseQuickAdapter +import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.sw.dualscreen.R +import com.sw.dualscreen.databinding.ListItemSearchFoodBinding +import com.sw.dualscreen.ext.format2String +import com.sw.dualscreen.model.response.FoodInfo + +class CollectFoodListAdapter(var list: MutableList) : + BaseQuickAdapter(list) { + inner class VH(var binding: ListItemSearchFoodBinding) : QuickViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + val inflater = LayoutInflater.from(context) + val binding = ListItemSearchFoodBinding.inflate(inflater, parent, false) + return VH(binding) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: FoodInfo?) { + holder.binding.root.setBackgroundResource(R.drawable.bg_text_collect) + holder.binding.tvFoodName.run { + if (item!!.score == 0) { + text = item.foodName + } else { + val score = (item.score / 100.0).format2String(2) + text = item.foodName + (if (item.score != 0) "-${score}%" else "") + } + isChecked = item.isChecked + setTextColor( + if (isChecked) "#FF3232".toColorInt() + else "#5E7585".toColorInt() + ) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/adapter/DialogSearchFoodAdapter.kt b/app/src/main/java/com/sw/dualscreen/adapter/DialogSearchFoodAdapter.kt new file mode 100644 index 0000000..c90f92a --- /dev/null +++ b/app/src/main/java/com/sw/dualscreen/adapter/DialogSearchFoodAdapter.kt @@ -0,0 +1,38 @@ +package com.sw.dualscreen.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.graphics.toColorInt +import com.chad.library.adapter4.BaseQuickAdapter +import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.sw.dualscreen.R +import com.sw.dualscreen.databinding.ListItemSearchFood2Binding +import com.sw.dualscreen.ext.format2String +import com.sw.dualscreen.model.response.FoodInfo + +class DialogSearchFoodAdapter(var list: MutableList) : + BaseQuickAdapter(list) { + + inner class VH(var binding: ListItemSearchFood2Binding) : QuickViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + val inflater = LayoutInflater.from(context) + val binding = ListItemSearchFood2Binding.inflate(inflater, parent, false) + return VH(binding) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: FoodInfo?) { + holder.binding.tvFoodName.run { + if (item!!.score == 0) { + text = item.foodName + } else { + val score = (item.score / 100.0).format2String(2) + text = item.foodName + (if (item.score != 0) "-${score}%" else "") + } + isChecked = item.isChecked + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/adapter/SearchFoodAdapter.kt b/app/src/main/java/com/sw/dualscreen/adapter/MainFoodListAdapter.kt similarity index 74% rename from app/src/main/java/com/sw/dualscreen/adapter/SearchFoodAdapter.kt rename to app/src/main/java/com/sw/dualscreen/adapter/MainFoodListAdapter.kt index 9fe3f48..366eec6 100644 --- a/app/src/main/java/com/sw/dualscreen/adapter/SearchFoodAdapter.kt +++ b/app/src/main/java/com/sw/dualscreen/adapter/MainFoodListAdapter.kt @@ -3,14 +3,16 @@ package com.sw.dualscreen.adapter import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.graphics.toColorInt import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.sw.dualscreen.R import com.sw.dualscreen.databinding.ListItemSearchFoodBinding import com.sw.dualscreen.ext.format2String import com.sw.dualscreen.model.response.FoodInfo -class SearchFoodAdapter(var list: MutableList) : - BaseQuickAdapter(list) { +class MainFoodListAdapter(var list: MutableList) : + BaseQuickAdapter(list) { inner class VH(var binding: ListItemSearchFoodBinding) : QuickViewHolder(binding.root) @@ -21,6 +23,7 @@ class SearchFoodAdapter(var list: MutableList) : } override fun onBindViewHolder(holder: VH, position: Int, item: FoodInfo?) { + holder.binding.root.setBackgroundResource(R.drawable.bg_text_main) holder.binding.tvFoodName.run { if (item!!.score == 0) { text = item.foodName @@ -29,6 +32,12 @@ class SearchFoodAdapter(var list: MutableList) : text = item.foodName + (if (item.score != 0) "-${score}%" else "") } isChecked = item.isChecked + setTextColor( + + + if (isChecked) "#FF3232".toColorInt() + else "#0A1428".toColorInt() + ) } } diff --git a/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt b/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt index d67752a..6aa70d1 100644 --- a/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt +++ b/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt @@ -14,8 +14,6 @@ object ApiClient { private const val BASE_URL = "http://device.shuziweidao.com:8889/" private const val TIME_OUT = 30L // 超时时间(秒) - //todo 临时测试改为5秒 -// private const val TIME_OUT = 5L // 超时时间(秒) private val okHttpClient = OkHttpClient.Builder() .connectTimeout(TIME_OUT, TimeUnit.SECONDS) diff --git a/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt b/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt index 733620d..335d3e1 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt @@ -451,10 +451,15 @@ class MainScreenPresentation( isLoadUnbilledMode = false }, 10000) - //上次已经识别过人脸 - step3ShowRecognizeResult(currentUserId!!) + if (isAgainLoadData.not()) { + //上次已经识别过人脸 + step3ShowRecognizeResult(currentUserId!!) + isAgainLoadData = true + } } + public var isAgainLoadData = false + private var isFirstOpen = true var startTime = 0L @@ -673,9 +678,7 @@ class MainScreenPresentation( var maxKcal = userNutrition?.maxCalorie ?: 1.0 Timber.tag(TAG).d("maxKcal = $maxKcal") // 避免0作为被除数 - if (maxKcal <= 0.0) { - maxKcal = 1.0 - } + maxKcal = if (maxKcal <= 0.0) 1.0 else maxKcal Timber.tag(TAG).d("maxKcal 1 = $maxKcal") include.totalKcalTv.text = totalKcal.format2String(2) var totalKcalHeight = (totalKcal / maxKcal).toFloat() @@ -696,6 +699,7 @@ class MainScreenPresentation( val grainIndex = UserNutritionUtils.findCalorieIndex(energy.grain, grainArray) include.customFoodColumn.setImageDrawable(false, grainIndex) include.totalFoodTv.text = grain.format2String(2) + columnMax = if (columnMax <= 0.0) 1.0 else columnMax var grainHeight = (grain / columnMax).toFloat() if (grainHeight == 0F) { include.divTotalFoodView.visible() @@ -716,7 +720,6 @@ class MainScreenPresentation( include.customVegetableColumn.setImageDrawable(false, fruitsIndex) include.totalVegetableTv.text = fruitsVegetables.format2String(2) var fruitsHeight = (fruitsVegetables / columnMax).toFloat() - if (fruitsHeight == 0F) { include.divVegetableView.visible() } else { @@ -852,6 +855,7 @@ class MainScreenPresentation( val faceEntity = compareResult.faceEntity val userId = faceEntity.userName currentUserId = userId + isAgainLoadData = false if (userId == null) return@Observer //ToastUtils.showToast("人脸识别成功,userId = $userId") if (currentFood == null) { diff --git a/app/src/main/java/com/sw/dualscreen/view/CustomBottomSheetDialog.kt b/app/src/main/java/com/sw/dualscreen/view/CustomBottomSheetDialog.kt index dba726d..13585d7 100644 --- a/app/src/main/java/com/sw/dualscreen/view/CustomBottomSheetDialog.kt +++ b/app/src/main/java/com/sw/dualscreen/view/CustomBottomSheetDialog.kt @@ -7,17 +7,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.sw.dualscreen.R -import com.sw.dualscreen.adapter.SearchFoodAdapter +import com.sw.dualscreen.adapter.DialogSearchFoodAdapter import com.sw.dualscreen.databinding.BottomSheetDialogBinding import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.utils.Debouncer import com.sw.dualscreen.utils.KeyboardUtils import com.sw.dualscreen.viewmodel.UserViewModel -import kotlinx.coroutines.launch import timber.log.Timber import androidx.core.graphics.drawable.toDrawable @@ -33,7 +31,7 @@ class CustomBottomSheetDialog( // lateinit var adapter: GenericItemAdapter private val searchFoodList = mutableListOf() private val adapter by lazy { - SearchFoodAdapter(searchFoodList).apply { + DialogSearchFoodAdapter(searchFoodList).apply { setOnItemClickListener { adapter, view, position -> searchFoodList.forEachIndexed { index, info -> searchFoodList[index].isChecked = index == position diff --git a/app/src/main/res/color/color_search_food.xml b/app/src/main/res/color/color_search_food.xml deleted file mode 100644 index e6c6fd0..0000000 --- a/app/src/main/res/color/color_search_food.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/color_text_dialog.xml b/app/src/main/res/color/color_text_dialog.xml new file mode 100644 index 0000000..ac5dd01 --- /dev/null +++ b/app/src/main/res/color/color_text_dialog.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_search_food.xml b/app/src/main/res/drawable/bg_text_collect.xml similarity index 78% rename from app/src/main/res/drawable/bg_search_food.xml rename to app/src/main/res/drawable/bg_text_collect.xml index e71abfc..a421bdd 100644 --- a/app/src/main/res/drawable/bg_search_food.xml +++ b/app/src/main/res/drawable/bg_text_collect.xml @@ -2,14 +2,14 @@ - - + + - + diff --git a/app/src/main/res/drawable/bg_text_dialog.xml b/app/src/main/res/drawable/bg_text_dialog.xml new file mode 100644 index 0000000..8ab1620 --- /dev/null +++ b/app/src/main/res/drawable/bg_text_dialog.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ 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_text_main.xml new file mode 100644 index 0000000..1911b73 --- /dev/null +++ b/app/src/main/res/drawable/bg_text_main.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8a76872..2d8bf3d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -157,8 +157,8 @@ android:id="@+id/flPay" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="@color/white" android:visibility="gone"> - @@ -62,10 +62,9 @@ + android:layout_weight="1.7" + android:layout_width="0dp"> \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_search_food2.xml b/app/src/main/res/layout/list_item_search_food2.xml new file mode 100644 index 0000000..da4ef66 --- /dev/null +++ b/app/src/main/res/layout/list_item_search_food2.xml @@ -0,0 +1,18 @@ + + \ No newline at end of file