refactor(ui): 重构主界面食物列表布局和支付模式切换功能

- 将原有的RecyclerView替换为FrameLayout容器,实现动态布局加载
- 新增layout_main_food_list.xml和layout_main_food_list2.xml两个布局文件
- 实现联合支付和独立支付两种模式下的不同UI展示
- 集成食物详情显示功能,通过include方式引入layout_eat_detail.xml
- 更新数据绑定逻辑,支持两种支付模式下的食物列表显示
- 迁移SharedPreferences操作至SpTool工具类统一管理
- 优化食物识别结果显示逻辑和搜索按钮状态控制
- 重构RecyclerView初始化和适配器设置代码结构
This commit is contained in:
2026-04-24 15:37:57 +08:00
parent e3b01ff789
commit 03c5aee785
8 changed files with 178 additions and 76 deletions
@@ -13,6 +13,7 @@ import android.text.TextUtils
import android.view.Display
import android.view.View
import android.view.ViewOutlineProvider
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.camera.core.CameraSelector
@@ -22,13 +23,18 @@ import androidx.camera.core.ImageCaptureException
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.common.util.concurrent.ListenableFuture
import com.sw.dualscreen.GlobalData
import com.sw.dualscreen.GlobalKey
import com.sw.dualscreen.adapter.MainFoodListAdapter
import com.sw.dualscreen.databinding.ActivityMainBinding
import com.sw.dualscreen.databinding.LayoutEatDetailBinding
import com.sw.dualscreen.databinding.LayoutMainFoodList2Binding
import com.sw.dualscreen.databinding.LayoutMainFoodListBinding
import com.sw.dualscreen.dialog.EnvSwitchDialog
import com.sw.dualscreen.dialog.RemindDialog
import com.sw.dualscreen.ext.dp
@@ -180,6 +186,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
// SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
// }
private lateinit var rvFoodList: RecyclerView
private lateinit var tvToSearch: TextView
lateinit var layoutEatDetailBinding: LayoutEatDetailBinding
override fun getViewModel(): BaseViewModel {
return viewModel
}
@@ -202,25 +212,66 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
initData()
}
private fun initLayoutEatDetailBinding(mode: Int) {
binding.flFoodList.removeAllViews()
if (mode == 0) {
//联合支付
val b = LayoutMainFoodList2Binding.inflate(layoutInflater, binding.flFoodList, true)
rvFoodList = b.rvFoodList
tvToSearch = b.tvToSearch
layoutEatDetailBinding = b.detailInclude
layoutEatDetailBinding.llFoodTitle.gone()
// layoutEatDetailBinding.root.invisible()
} else {
//独立支付
val b = LayoutMainFoodListBinding.inflate(layoutInflater, binding.flFoodList, true)
rvFoodList = b.rvFoodList
tvToSearch = b.tvToSearch
layoutEatDetailBinding = b.detailInclude
layoutEatDetailBinding.llFoodTitle.gone()
layoutEatDetailBinding.root.gone()
}
tvToSearch.setOnClickListener {
bottomSheetDialog = CustomBottomSheetDialog.newInstance(viewModel) {
checkedItem = it
it.photoUri = null
adapter.items.forEachIndexed { index, info ->
adapter.items[index].isChecked = false
}
adapter.notifyDataSetChanged()
resetSelectedFood(it)
}
bottomSheetDialog!!.show(supportFragmentManager, "CustomBottomSheetDialog")
}
rvFoodList.let {
it.layoutManager = GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false)
it.adapter = adapter
}
}
private fun initData() {
startFaceTask()
}
private fun initView() {
initLayoutEatDetailBinding(SpTool.settlementMode)
viewModel.getDeviceConfig { deviceConfig ->
runOnUiThread {
if (deviceConfig == null) {
ToastUtils.showToast("获取设备配置数据失败")
initLayoutEatDetailBinding(SpTool.settlementMode)
return@runOnUiThread
}
//结算模式:1-独立支付,2-联合结算
settlementMode = if (deviceConfig.payType == 2) 0 else 1
SPUtil.getInstance().put(GlobalKey.KEY_SETTLEMENT_MODE, settlementMode)
SpTool.settlementMode = settlementMode
GlobalData.appId = deviceConfig.arcsoftAppId ?: ""
GlobalData.sdkKey = deviceConfig.arcsoftSdkKey ?: ""
GlobalData.activeKey = deviceConfig.arcsoftActiveKey ?: ""
viewModel.activeEngine()
initLayoutEatDetailBinding(settlementMode)
}
}
updateDateTime()
@@ -264,23 +315,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
}
}
binding.previewView.clipToOutline = true
binding.tvToSearch.setOnClickListener {
bottomSheetDialog = CustomBottomSheetDialog.newInstance(viewModel) {
checkedItem = it
it.photoUri = null
adapter.items.forEachIndexed { index, info ->
adapter.items[index].isChecked = false
}
adapter.notifyDataSetChanged()
resetSelectedFood(it)
}
bottomSheetDialog!!.show(supportFragmentManager, "CustomBottomSheetDialog")
}
binding.recyclerview.let {
it.layoutManager = GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false)
it.adapter = adapter
}
binding.tvFoodName.setOnClickListener {
SensorScaleUtils.zero()
}
@@ -545,7 +579,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
log("registerDataChange识别后查询接口数据:$queryData,识别数据:$recData")
if (list.isEmpty()) {
foodRecognizeState = false
binding.tvToSearch.let {
tvToSearch.let {
it.text = "未查询到,手动搜索"
it.visible()
}
@@ -571,7 +605,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
// }
adapter.submitList(list)
binding.recyclerview.visible()
rvFoodList.visible()
checkedItem = list[0].also {
it.photoUri = lastPhotoUri
@@ -582,10 +616,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
// lastPhotoUri = null
LightManager.closeRedLight()
binding.tvToSearch.let {
tvToSearch.let {
it.text = "以上都不是,手动搜索"
it.visible()
}
log("registerDataChange识别完成:visible=${rvFoodList.isVisible},count=${rvFoodList.childCount}")
}
private fun setupCamera() {
@@ -756,9 +791,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
@SuppressLint("NotifyDataSetChanged")
fun clearRecognizeFood() {
log("clearRecognizeFood")
binding.recyclerview.invisible()
rvFoodList.invisible()
layoutEatDetailBinding.root.invisible()
adapter.submitList(null)
binding.tvToSearch.gone()
tvToSearch.gone()
binding.previewView.visible()
binding.ivImg.gone()
@@ -1294,7 +1330,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
//binding.layoutRescan.visibility = View.VISIBLE
withContext(Dispatchers.Main) {
binding.tvToSearch.let {
tvToSearch.let {
it.text = "未识别到,手动搜索"
it.visible()
}