diff --git a/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt index 13132ce..2a0ff8e 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt @@ -97,17 +97,9 @@ class CookingModeActivity : BaseActivity() { private var isClearingByTabSwitch = false private fun addViewListener() { - binding.dishRadioGroup.setOnCheckedChangeListener { _, checkedId -> - dinnerType = when (checkedId) { - R.id.rbBreakfast -> "1" - R.id.rbLunch -> "2" - R.id.rbDinner -> "3" - else -> "1" - } - // 切换餐次时清空搜索框,避免用户误以为列表是被过滤的状态 - clearSearchText() - loadFragment() - } + binding.tvBreakfast.setOnClickListener { selectTab("1") } + binding.tvLunch.setOnClickListener { selectTab("2") } + binding.tvDinner.setOnClickListener { selectTab("3") } binding.etInputDish.addOnActionSearchListener { jumpSearch() } @@ -122,6 +114,20 @@ class CookingModeActivity : BaseActivity() { }) } + /** + * 切换餐次 Tab:更新选中态、清空搜索框、切换 Fragment + * 由点击事件调用,不触发额外的 getDishList(),由 onHiddenChanged 负责刷新 + */ + private fun selectTab(type: String) { + if (dinnerType == type) return + dinnerType = type + binding.tvBreakfast.isChecked = type == "1" + binding.tvLunch.isChecked = type == "2" + binding.tvDinner.isChecked = type == "3" + clearSearchText() + loadFragment() + } + /** 获取当前显示的 FoodListFragment */ private fun currentFragment(): FoodListFragment? { return runCatching { fragmentList[dinnerType.toInt() - 1] }.getOrNull() @@ -169,16 +175,15 @@ class CookingModeActivity : BaseActivity() { if (isConfigPage) { return } - //val isCooking = intent.getBooleanExtra(IS_COOKING, false) val lastDinnerType = intent.getStringExtra(DINNER_TYPE) ?: "0" - if (lastDinnerType == "1" || lastDinnerType == "2" || lastDinnerType == "3") { + if (lastDinnerType !in listOf("1", "2", "3")) return + if (lastDinnerType == dinnerType) { + // 同一 Tab:onHiddenChanged 不会触发,直接刷新 clearSearchText() - fragmentList.getOrNull(lastDinnerType.toInt() - 1)?.getDishList(1, lastDinnerType) - } - when (lastDinnerType) { - "1" -> binding.dishRadioGroup.check(R.id.rbBreakfast) - "2" -> binding.dishRadioGroup.check(R.id.rbLunch) - "3" -> binding.dishRadioGroup.check(R.id.rbDinner) + currentFragment()?.getDishList(1, lastDinnerType) + } else { + // 不同 Tab:selectTab → loadFragment → show → onHiddenChanged 负责刷新,无需直接调用 + selectTab(lastDinnerType) } }.onFailure { it.printStackTrace() diff --git a/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt b/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt index e4e99ec..7e2d01e 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt @@ -30,6 +30,7 @@ import com.yanzhenjie.recyclerview.SwipeMenuItem import androidx.fragment.app.viewModels import kotlinx.coroutines.Dispatchers import java.io.Serializable +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -55,6 +56,12 @@ class FoodListFragment : BaseFragment() { private var dinnerType = "0" + /** 跟踪当前请求协程,新请求发起前取消旧的,防止并发竞态导致数据错乱 */ + private var currentJob: Job? = null + + /** 缓存最后一次搜索词,返回二级页面后 onResume 可复用,避免搜索态被重置为全量查询 */ + private var currentFoodName: String? = null + private lateinit var activity: CookingModeActivity /** 第一页时先查数据库存入此字段,网络结果回来后直接使用,避免时序问题 */ @@ -140,7 +147,7 @@ class FoodListFragment : BaseFragment() { super.onResume() runCatching { pageNo = 1 - getDishList() + getDishList(currentFoodName) }.onFailure { it.printStackTrace() } @@ -200,7 +207,9 @@ class FoodListFragment : BaseFragment() { @SuppressLint("NotifyDataSetChanged") @Suppress("unchecked_cast") fun getDishList(foodName: String? = null) { - viewLifecycleOwner.lifecycleScope.launch { + currentFoodName = foodName + currentJob?.cancel() + currentJob = viewLifecycleOwner.lifecycleScope.launch { val param = mutableMapOf( "pageNum" to pageNo, "pageSize" to pageSize, diff --git a/app/src/main/res/layout/activity_cooking_mode.xml b/app/src/main/res/layout/activity_cooking_mode.xml index 39a1a17..19159ea 100644 --- a/app/src/main/res/layout/activity_cooking_mode.xml +++ b/app/src/main/res/layout/activity_cooking_mode.xml @@ -6,59 +6,62 @@ android:orientation="vertical" tools:background="@drawable/bg_other_page"> - - - - - +