From 574579104160ba6da82f8ced91b4577715450917 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Tue, 12 May 2026 15:17:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(activity):=20=E5=BC=B9=E7=AA=97=E9=A3=9F?= =?UTF-8?q?=E6=9D=90/=E8=B0=83=E6=96=99=E6=9F=A5=E8=AF=A2=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=8B=AC=E7=AB=8B=20StateFlow=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=B0=83=E6=96=99=E5=88=97=E8=A1=A8=E5=8F=8C=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E5=88=87=E6=8D=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NetViewModel 新增 foodSearchGoodsListState 和 queryFoodSearchGoodsList,与 goodsListState 隔离 - FoodSearchDialog、SeasoningSelectDialog 改用弹窗专用 State,避免影响 FoodRecognizeActivity 列表 - SeasoningWeightAdapter 支持 Grid(4列)/List(2列)双布局模式 - SubmitFoodActivity 添加调料列表布局切换按钮 - FoodModule 变量重命名并添加未初始化保护 - 注释掉 mock 食材数据,调整相关布局边距与文字截断 Co-Authored-By: Claude Sonnet 4.6 --- .../match/adapter/SeasoningWeightAdapter.kt | 39 ++++++++++++---- .../dish/match/dialog/FoodSearchDialog.kt | 11 ++--- .../match/dialog/SeasoningSelectDialog.kt | 6 +-- .../com/shuwei/dish/match/net/NetViewModel.kt | 37 +++++++++++++++ .../shuwei/dish/match/objbox/FoodModule.kt | 13 ++++-- .../dish/match/ui/SubmitFoodActivity.kt | 9 +++- .../match/utils/RawMaterialsDialogUtils.kt | 42 +++++++++--------- .../res/drawable-xxhdpi/ic_switch_box.png | Bin 0 -> 2036 bytes .../main/res/layout/activity_submit_food.xml | 35 +++++++++++---- .../res/layout/dialog_seasoning_select.xml | 4 +- .../res/layout/item_seasoning_weight_list.xml | 37 +++++++++++++++ .../main/res/layout/list_item_scale22_row.xml | 2 + 12 files changed, 181 insertions(+), 54 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/ic_switch_box.png create mode 100644 app/src/main/res/layout/item_seasoning_weight_list.xml diff --git a/app/src/main/java/com/shuwei/dish/match/adapter/SeasoningWeightAdapter.kt b/app/src/main/java/com/shuwei/dish/match/adapter/SeasoningWeightAdapter.kt index 35cc841..6a00f53 100644 --- a/app/src/main/java/com/shuwei/dish/match/adapter/SeasoningWeightAdapter.kt +++ b/app/src/main/java/com/shuwei/dish/match/adapter/SeasoningWeightAdapter.kt @@ -6,14 +6,25 @@ import android.view.ViewGroup import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.shuwei.dish.match.databinding.ItemSeasoningWeightBinding +import com.shuwei.dish.match.databinding.ItemSeasoningWeightListBinding import com.shuwei.dish.match.utils.ext.roundedDecimalPlace /** * 调料使用重量列表 Adapter * 用于 SubmitFoodActivity 展示各调料槽位的实时用量 * 同名调料已在外部聚合,adapter 按 goodsName 作为唯一标识 + * 支持两种布局模式: + * - VIEW_TYPE_GRID(默认):4 列卡片,名称与重量垂直排列 + * - VIEW_TYPE_LIST:2 列,名称与重量水平排列,名称占剩余空间 */ -class SeasoningWeightAdapter : BaseQuickAdapter() { +class SeasoningWeightAdapter : BaseQuickAdapter() { + + companion object { + /** 4 列卡片模式 */ + const val VIEW_TYPE_GRID = 0 + /** 2 列水平模式 */ + const val VIEW_TYPE_LIST = 1 + } /** 调料展示数据项,key = goodsName(同名调料已聚合) */ data class Item( @@ -23,6 +34,13 @@ class SeasoningWeightAdapter : BaseQuickAdapter): Int { + return if (isListMode) VIEW_TYPE_LIST else VIEW_TYPE_GRID + } + /** * 更新单个 item,按 goodsName 匹配;不存在则追加 */ @@ -43,18 +61,21 @@ class SeasoningWeightAdapter : BaseQuickAdapter= 0) removeAt(idx) } - override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { - val binding = ItemSeasoningWeightBinding.inflate(LayoutInflater.from(context), parent, false) - return VH(binding) + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): QuickViewHolder { + return if (viewType == VIEW_TYPE_LIST) { + val binding = ItemSeasoningWeightListBinding.inflate(LayoutInflater.from(context), parent, false) + QuickViewHolder(binding.root) + } else { + val binding = ItemSeasoningWeightBinding.inflate(LayoutInflater.from(context), parent, false) + QuickViewHolder(binding.root) + } } - override fun onBindViewHolder(holder: VH, position: Int, item: Item?) { + override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: Item?) { item ?: return - holder.binding.tvSeasoningName.text = item.goodsName val showWeight = "${item.useWeight.roundedDecimalPlace(1)}g" - holder.binding.tvSeasoningWeight.text = showWeight + holder.setText(com.shuwei.dish.match.R.id.tvSeasoningName, item.goodsName) + holder.setText(com.shuwei.dish.match.R.id.tvSeasoningWeight, showWeight) } - inner class VH(var binding: ItemSeasoningWeightBinding) : QuickViewHolder(binding.root) - } diff --git a/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt b/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt index f6808b0..6de860a 100644 --- a/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt +++ b/app/src/main/java/com/shuwei/dish/match/dialog/FoodSearchDialog.kt @@ -116,7 +116,7 @@ class FoodSearchDialog( } binding.refreshLayout.run { - setEnableRefresh(false) + setEnableRefresh(true) setEnableLoadMore(false) setOnRefreshListener { pageNo = 1; getGoodsList() } setOnLoadMoreListener { getGoodsList() } @@ -175,12 +175,13 @@ class FoodSearchDialog( } /** - * 收集 goodsListState,统一处理 Loading / Success / Error 状态 + * 收集 foodSearchGoodsListState,统一处理 Loading / Success / Error 状态 + * 使用独立的 State,避免与 FoodRecognizeActivity 等页面共用 goodsListState 产生干扰 */ private fun initObserver() { activity.lifecycleScope.launch { activity.repeatOnLifecycle(Lifecycle.State.STARTED) { - activity.netViewModel.goodsListState.collect { state -> + activity.netViewModel.foodSearchGoodsListState.collect { state -> when (state) { is UiState.Success -> loadGoodsList(state.data) is UiState.Error -> { @@ -208,10 +209,10 @@ class FoodSearchDialog( } /** - * 请求食材列表 + * 请求食材列表,使用弹窗专用接口,结果写入 foodSearchGoodsListState */ private fun getGoodsList() { - activity.netViewModel.queryGoodsList( + activity.netViewModel.queryFoodSearchGoodsList( goodsType = "0", pageNum = pageNo, pageSize = PAGE_SIZE, diff --git a/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSelectDialog.kt b/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSelectDialog.kt index 7b927db..34311c2 100644 --- a/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSelectDialog.kt +++ b/app/src/main/java/com/shuwei/dish/match/dialog/SeasoningSelectDialog.kt @@ -102,7 +102,7 @@ class SeasoningSelectDialog( } binding.refreshLayout.run { - setEnableRefresh(false) + setEnableRefresh(true) setEnableLoadMore(false) setOnRefreshListener { pageNo = 1; getGoodsList() } setOnLoadMoreListener { getGoodsList() } @@ -117,7 +117,7 @@ class SeasoningSelectDialog( super.show() // 启动 StateFlow 收集,弹窗关闭时由 setOnDismissListener 取消 collectJob = activity.lifecycleScope.launch { - activity.netViewModel.goodsListState.collect { state -> + activity.netViewModel.foodSearchGoodsListState.collect { state -> when (state) { is UiState.Loading -> {} is UiState.Success -> loadGoodsList(state.data) @@ -186,7 +186,7 @@ class SeasoningSelectDialog( * 请求调料列表 */ private fun getGoodsList() { - activity.netViewModel.queryGoodsList( + activity.netViewModel.queryFoodSearchGoodsList( goodsType = "1", pageNum = pageNo, pageSize = PAGE_SIZE, diff --git a/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt b/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt index 059dabf..2661008 100644 --- a/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt +++ b/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt @@ -102,6 +102,12 @@ class NetViewModel( private val _goodsListState = MutableStateFlow?>>(UiState.Idle) val goodsListState: StateFlow?>> = _goodsListState.asStateFlow() + /** + * 食材搜索弹窗专用的 UI 状态流,与 goodsListState 隔离,避免弹窗请求影响其他页面 + */ + private val _foodSearchGoodsListState = MutableStateFlow?>>(UiState.Idle) + val foodSearchGoodsListState: StateFlow?>> = _foodSearchGoodsListState.asStateFlow() + /** * 查询物品信息列表(食材 goodsType=0,调料 goodsType=1 共用) * @param goodsType 物品类型:0=食材,1=调料 @@ -133,6 +139,37 @@ class NetViewModel( } } + /** + * 食材搜索弹窗专用的查询方法,结果写入 foodSearchGoodsListState,不影响 goodsListState + * @param goodsType 物品类型:0=食材,1=调料 + * @param placeId 场所 ID,默认取当前食堂 ID + * @param pageNum 页码,默认第 1 页 + * @param pageSize 每页条数,默认 50 + * @param goodsName 按名称模糊搜索,为 null 时不传该字段 + * @param goodsNames 按名称+净材种类列表批量查询,为 null 时不传该字段 + */ + fun queryFoodSearchGoodsList( + goodsType: String, + placeId: String = BaseApp.canteenId, + pageNum: Int = 1, + pageSize: Int = 50, + goodsName: String? = null, + goodsNames: List? = null + ) { + val param = mutableMapOf( + "goodsType" to goodsType, + "placeId" to placeId, + "pageNum" to pageNum, + "pageSize" to pageSize + ) + goodsName?.let { param["goodsName"] = it } + goodsNames?.let { param["goodsNames"] = it } + viewModelScope.launch { + _foodSearchGoodsListState.value = UiState.Loading + _foodSearchGoodsListState.value = repository.queryGoodsList(param) + } + } + /** * 上传采集菜品信息 UI 状态流,UI 层通过 collect 监听 */ diff --git a/app/src/main/java/com/shuwei/dish/match/objbox/FoodModule.kt b/app/src/main/java/com/shuwei/dish/match/objbox/FoodModule.kt index 9fa2242..4c24f32 100644 --- a/app/src/main/java/com/shuwei/dish/match/objbox/FoodModule.kt +++ b/app/src/main/java/com/shuwei/dish/match/objbox/FoodModule.kt @@ -22,7 +22,7 @@ import java.io.InputStream object FoodModule { - private lateinit var module_mobile: Module + private lateinit var module: Module private val NO_MEAN_RGB = floatArrayOf(0.0f, 0.0f, 0.0f) private val NO_STD_RGB = floatArrayOf(1.0f, 1.0f, 1.0f) @@ -37,8 +37,8 @@ object FoodModule { suspend fun init(context: Context) { withContext(Dispatchers.IO) { - module_mobile = Module.load(copyAssetToCache(context, "best_embedding_model_mobile.pt")) - initDefFoodData(context) + module = Module.load(copyAssetToCache(context, "best_embedding_model_mobile.pt")) +// initDefFoodData(context) } } @@ -51,6 +51,11 @@ object FoodModule { // } fun bitmap2FloatArray(originBitmap: Bitmap, isRecycle: Boolean): FloatArray? { + // 模型未初始化时直接返回 null,避免 UninitializedPropertyAccessException + if (!::module.isInitialized) { + logInfo("bitmap2FloatArray: module 尚未初始化,跳过推理") + return null + } var rgb565Bitmap: Bitmap? = null try { val scaledBitmap = originBitmap.scale(MODEL_INPUT_WIDTH, MODEL_INPUT_HEIGHT) @@ -64,7 +69,7 @@ object FoodModule { NO_MEAN_RGB, // [0.485, 0.456, 0.406] TORCHVISION_NORM_MEAN_RGB NO_STD_RGB // [0.229, 0.224, 0.225] TORCHVISION_NORM_STD_RGB ) - val outputTensor = module_mobile.forward(IValue.from(inputTensor)).toTensor() + val outputTensor = module.forward(IValue.from(inputTensor)).toTensor() return outputTensor.dataAsFloatArray } catch (e: OutOfMemoryError) { e.printStackTrace() diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SubmitFoodActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SubmitFoodActivity.kt index e680af6..f6d947f 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SubmitFoodActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SubmitFoodActivity.kt @@ -156,7 +156,7 @@ class SubmitFoodActivity : BaseActivity() { } } - /** 初始化 RecyclerView,24列 GridLayoutManager */ + /** 初始化 RecyclerView,默认 4 列 GridLayoutManager */ private fun setupRecyclerView() { binding.rvSeasoning.let { it.itemAnimator = null @@ -303,6 +303,13 @@ class SubmitFoodActivity : BaseActivity() { } private fun addViewListener() { + // 切换调料列表布局:4 列卡片 ↔ 2 列水平 + binding.ivSeasoningLayoutToggle.setOnClickListener { + seasoningAdapter.isListMode = !seasoningAdapter.isListMode + val spanCount = if (seasoningAdapter.isListMode) 2 else 4 + (binding.rvSeasoning.layoutManager as? GridLayoutManager)?.spanCount = spanCount + seasoningAdapter.notifyDataSetChanged() + } binding.btnCook.clickWithDebounce { val content = getRemindSpannable("开始制作") showRemindDialog(content) { cook() } diff --git a/app/src/main/java/com/shuwei/dish/match/utils/RawMaterialsDialogUtils.kt b/app/src/main/java/com/shuwei/dish/match/utils/RawMaterialsDialogUtils.kt index b67e7fb..4c905ec 100644 --- a/app/src/main/java/com/shuwei/dish/match/utils/RawMaterialsDialogUtils.kt +++ b/app/src/main/java/com/shuwei/dish/match/utils/RawMaterialsDialogUtils.kt @@ -18,27 +18,27 @@ import com.shuwei.dish.match.utils.ext.toast * TODO: 联调完成后删除 */ fun buildMockGoodsList(): List = mutableListOf( - GoodsItem(goodsId = "1", goodsName = "土豆", rawMaterialsType = "土豆丝,土豆条,土豆片,土豆丁"), - GoodsItem(goodsId = "2", goodsName = "胡萝卜", rawMaterialsType = "胡萝卜丝,胡萝卜片,胡萝卜丁"), - GoodsItem(goodsId = "3", goodsName = "黄瓜", rawMaterialsType = "黄瓜丝,黄瓜片,黄瓜丁,黄瓜块"), - GoodsItem(goodsId = "4", goodsName = "洋葱", rawMaterialsType = "洋葱丝,洋葱丁,洋葱圈"), - GoodsItem(goodsId = "5", goodsName = "白菜", rawMaterialsType = "白菜丝,白菜块,白菜叶"), - GoodsItem(goodsId = "6", goodsName = "豆腐", rawMaterialsType = "豆腐块,豆腐丁"), - GoodsItem(goodsId = "7", goodsName = "猪肉", rawMaterialsType = "猪肉丝,猪肉片,猪肉丁,猪肉块"), - GoodsItem(goodsId = "8", goodsName = "鸡胸肉", rawMaterialsType = "鸡胸肉丝,鸡胸肉片,鸡胸肉丁"), - GoodsItem(goodsId = "9", goodsName = "牛肉", rawMaterialsType = "牛肉丝,牛肉片,牛肉块"), - GoodsItem(goodsId = "10", goodsName = "虾仁", rawMaterialsType = "整虾仁,切段虾仁"), - GoodsItem(goodsId = "11", goodsName = "茄子", rawMaterialsType = "茄子丝,茄子片,茄子块,茄子条"), - GoodsItem(goodsId = "12", goodsName = "青椒", rawMaterialsType = "青椒丝,青椒片,青椒块"), - GoodsItem(goodsId = "13", goodsName = "西红柿", rawMaterialsType = "西红柿片,西红柿块,西红柿丁"), - GoodsItem(goodsId = "14", goodsName = "芹菜", rawMaterialsType = "芹菜段,芹菜丝"), - GoodsItem(goodsId = "15", goodsName = "莲藕", rawMaterialsType = "莲藕片,莲藕丁,莲藕丝"), - // 以下5条 rawMaterialsType 为空,测试无净材数据场景 - GoodsItem(goodsId = "16", goodsName = "菠菜"), - GoodsItem(goodsId = "17", goodsName = "生菜"), - GoodsItem(goodsId = "18", goodsName = "香菇"), - GoodsItem(goodsId = "19", goodsName = "木耳"), - GoodsItem(goodsId = "20", goodsName = "豆芽"), +// GoodsItem(goodsId = "1", goodsName = "土豆", rawMaterialsType = "土豆丝,土豆条,土豆片,土豆丁"), +// GoodsItem(goodsId = "2", goodsName = "胡萝卜", rawMaterialsType = "胡萝卜丝,胡萝卜片,胡萝卜丁"), +// GoodsItem(goodsId = "3", goodsName = "黄瓜", rawMaterialsType = "黄瓜丝,黄瓜片,黄瓜丁,黄瓜块"), +// GoodsItem(goodsId = "4", goodsName = "洋葱", rawMaterialsType = "洋葱丝,洋葱丁,洋葱圈"), +// GoodsItem(goodsId = "5", goodsName = "白菜", rawMaterialsType = "白菜丝,白菜块,白菜叶"), +// GoodsItem(goodsId = "6", goodsName = "豆腐", rawMaterialsType = "豆腐块,豆腐丁"), +// GoodsItem(goodsId = "7", goodsName = "猪肉", rawMaterialsType = "猪肉丝,猪肉片,猪肉丁,猪肉块"), +// GoodsItem(goodsId = "8", goodsName = "鸡胸肉", rawMaterialsType = "鸡胸肉丝,鸡胸肉片,鸡胸肉丁"), +// GoodsItem(goodsId = "9", goodsName = "牛肉", rawMaterialsType = "牛肉丝,牛肉片,牛肉块"), +// GoodsItem(goodsId = "10", goodsName = "虾仁", rawMaterialsType = "整虾仁,切段虾仁"), +// GoodsItem(goodsId = "11", goodsName = "茄子", rawMaterialsType = "茄子丝,茄子片,茄子块,茄子条"), +// GoodsItem(goodsId = "12", goodsName = "青椒", rawMaterialsType = "青椒丝,青椒片,青椒块"), +// GoodsItem(goodsId = "13", goodsName = "西红柿", rawMaterialsType = "西红柿片,西红柿块,西红柿丁"), +// GoodsItem(goodsId = "14", goodsName = "芹菜", rawMaterialsType = "芹菜段,芹菜丝"), +// GoodsItem(goodsId = "15", goodsName = "莲藕", rawMaterialsType = "莲藕片,莲藕丁,莲藕丝"), +// // 以下5条 rawMaterialsType 为空,测试无净材数据场景 +// GoodsItem(goodsId = "16", goodsName = "菠菜"), +// GoodsItem(goodsId = "17", goodsName = "生菜"), +// GoodsItem(goodsId = "18", goodsName = "香菇"), +// GoodsItem(goodsId = "19", goodsName = "木耳"), +// GoodsItem(goodsId = "20", goodsName = "豆芽"), ) /** diff --git a/app/src/main/res/drawable-xxhdpi/ic_switch_box.png b/app/src/main/res/drawable-xxhdpi/ic_switch_box.png new file mode 100644 index 0000000000000000000000000000000000000000..161a008d6c56ec33692784aec4e28ab8bb4347b6 GIT binary patch literal 2036 zcmVsbJE^#z+cH`w-ln-2@>MkR&_1f@mUC ztRJa~V6lS5J_ur-#oz}NECnC*K~%(6iwRA#>;Hx<4a=R~Gdt6rd*>Xv$JxDeKmO;O z-`=D%xjU&Y`Hyu31OV3Q@9Gi&1OVm{VD7%G00IE>2rzeFRsaEjc?6icUw2zpfO;gD z9t8lViLbjY0MsMF^e6x@O?=&L0iYfUrbhvQY2xc{2L{0Nydl^;>;mj-1MD0$lq;3W z;kr}Jj%YgyI}0;Gd(;}vluD(OGcz;yG>gIRbAbRr(7r|I4`E}lXJH2ou%pnBt5&O@ zLf;p7?OSmEO`JRfdkJQO_NXFIflGMFK4_Vo7lK5U2<<7JQl08RUi_hgqq z{6e^I*IRknBmyJ=n)H`bmPbGUusnfb+Aa&vG^6nrCgyn$_9Yp z;o)^$()K7pNkE$=$8o+?ezY<+0H{C|3Wa${pN0VPS?k${oBevkcMjUn`T&25RBL9#JKlO8rd0%T)|Ci|#j z0|0!LqKSY2pa}}6Dgl5~wl%&A0GgoKToqKi01z}{32QF^BrKsp-4OtSMl50N1%QMl zG^jgN0ImfcIL`LC>i2J)^V>8x2>{$Y`Nkrr{>kNXs}|{vRVoR9_4V~1q4IZ_4dpAH zNN%eF?h5{=i$h}_2>{o1Z(zX1#?B_bPo+|mI$gLIpf-l+P9>tQ(Fx@1YGa-5JqZBS zF`v&n_)(BkuMM^9&^LzV|0kWkiHV87QU4B%LphIpeMWJV41gM}P$;}!tyUieU8iAZ zQMY1%%|XlH=H_NU^fmpPc*k*0K<_ZxpTp4v?NMv^7$1UZ`1w5iBb7h^s1b|B;t!x} z9`-UOdeQ)!fR^RS$;m&JzE%dkAE5mZjwWc2TEhT71o9_gtss!|w;~XD1-R8!UL_#{ z0zeY77{UhuAVlzz&{Y7iJd0uF3jkpwXnB7D!14r!l`jBv^6DTcT&7WnkyQRxRTJ%|~E~eQqFpQ;)=J8Haj< zKme3VrB`sj{d?STdJ8s!K}^^ZU4)jUbUJ+%`c6WVZ^3zWqeN|;RzWgBd)pe|q^_^p z{jA{r2q2-u&Y_(cN1b=`gV zlnqe^jJr*>TAlIHaGy_oQmaYZ;Yk2wvsv{RwtFp!)Kfa00Ju+ApWwQ?D87*Zz|#5z zWiUh9+=(9pra$7=kWh7XkpO^N5>04lMA=~Wl+Z9irveaW4(V%f1OxzslhX-l0zfCC z9N`>M4N^N&-!N z|G|jkIP%;;Bv)Gyob#{|SkzmyO&IS4{8Dgheb-g8S^;zc;9e&HFeg9&5CE7*fVum! z0tf)SBH(%6@lvVe+G6eK43be+D*%$e{oFuY7M@D7!B4gMg~S0H0OYxWdLGySkjZ37 z8zuB%vahyQtMyY - + android:layout_marginEnd="22dp" + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_item_scale22_row.xml b/app/src/main/res/layout/list_item_scale22_row.xml index 83342f2..c9ada5f 100644 --- a/app/src/main/res/layout/list_item_scale22_row.xml +++ b/app/src/main/res/layout/list_item_scale22_row.xml @@ -26,6 +26,8 @@ android:layout_height="wrap_content" android:gravity="center" android:includeFontPadding="false" + android:maxLines="3" + android:ellipsize="end" android:textColor="@color/black" android:textStyle="bold" />