From 84634f843d90158201cc5b238031dcb0720cc548 Mon Sep 17 00:00:00 2001 From: unknown <848755140@qq.com> Date: Fri, 26 Jun 2026 09:17:06 +0800 Subject: [PATCH] =?UTF-8?q?refactor(home):=20=E7=94=A8FlexboxLayoutManager?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2GridLayoutManager=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A1=8C=E5=88=97=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FlexboxLayoutManager(COLUMN+WRAP)天然列优先排列,数据无需重排。 item宽高在拿到接口行列数后直接计算,适配任意rows×cols配置。 Co-Authored-By: Claude Opus 4.7 --- app/build.gradle.kts | 2 ++ .../sw/scalefusion/shelf/HomeV3Activity.kt | 23 ++++++++++++++----- .../shelf/adapter/ShelfV3Adapter.kt | 13 +++++++++++ .../main/res/layout/list_item_shelf_v3.xml | 4 ++-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6d19293..137200f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -87,6 +87,8 @@ dependencies { implementation("org.greenrobot:eventbus:3.3.1") + implementation("com.google.android.flexbox:flexbox:3.0.0") + // implementation("io.github.jeremyliao:live-event-bus-x:1.8.0") // implementation("com.hoho:android-usb-serial:1.3.0") // implementation("io.github.jeadyx:jserialport:1.5") diff --git a/app/src/main/java/com/sw/scalefusion/shelf/HomeV3Activity.kt b/app/src/main/java/com/sw/scalefusion/shelf/HomeV3Activity.kt index 7682f62..d8c9157 100644 --- a/app/src/main/java/com/sw/scalefusion/shelf/HomeV3Activity.kt +++ b/app/src/main/java/com/sw/scalefusion/shelf/HomeV3Activity.kt @@ -23,8 +23,11 @@ import com.shuwei.intelligent.shelves.serial.ProtocolConstants import com.shuwei.intelligent.shelves.serial.ProtocolConstants.C_TEMP_CMD import com.shuwei.intelligent.shelves.serial.ProtocolConstants.START_TEMP_CTRL_CMD import com.shuwei.intelligent.shelves.serial.ScaleManager -import com.shuwei.intelligent.shelves.utils.GridLayoutTool +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager import com.shuwei.intelligent.shelves.utils.IntervalExecutor +import com.shuwei.intelligent.shelves.utils.ext.dp import com.shuwei.intelligent.shelves.utils.ext.gone import com.shuwei.intelligent.shelves.utils.ext.toast import com.shuwei.intelligent.shelves.utils.ext.visible @@ -153,10 +156,15 @@ class HomeV3Activity : BaseActivity() { log("updateUI: slots=${slots.size}, rows=$rows, columns=$columns") list.clear() - list.addAll(GridLayoutTool.initListSortV3(rows = rows, columns = columns, source = slots)) + list.addAll(slots) + + val displayMetrics = resources.displayMetrics + // 减去 RecyclerView + item 自身的 margin + shelfAdapter.itemWidth = (displayMetrics.widthPixels - 24.dp) / columns - 24.dp + shelfAdapter.itemHeight = (displayMetrics.heightPixels - 68.dp) / rows - 24.dp if (binding.rvShelf.adapter == null) { - initRecyclerView(columns) + initRecyclerView() } else { shelfAdapter.notifyDataSetChanged() } @@ -258,8 +266,11 @@ class HomeV3Activity : BaseActivity() { shelfAdapter.notifyItemChanged(position) } - private fun initRecyclerView(columns: Int) { - val layoutManager = GridLayoutTool.getLayoutManagerV2(this, columns = columns) + private fun initRecyclerView() { + val layoutManager = FlexboxLayoutManager(this).apply { + flexDirection = FlexDirection.COLUMN + flexWrap = FlexWrap.WRAP + } binding.rvShelf.let { it.layoutManager = layoutManager it.adapter = shelfAdapter @@ -345,7 +356,7 @@ class HomeV3Activity : BaseActivity() { /** 全量同步格口重量 */ private fun syncShelfGoodsToServer() { if (list.isEmpty()) return - val submitList = GridLayoutTool.submitListSortV3(list) + val submitList = list.sortedBy { it.slotNo.toIntOrNull() ?: 0 } viewModel.syncWeight( SyncWeightRequest( cabinetType = cabinetType, diff --git a/app/src/main/java/com/sw/scalefusion/shelf/adapter/ShelfV3Adapter.kt b/app/src/main/java/com/sw/scalefusion/shelf/adapter/ShelfV3Adapter.kt index 353e287..c1618e1 100644 --- a/app/src/main/java/com/sw/scalefusion/shelf/adapter/ShelfV3Adapter.kt +++ b/app/src/main/java/com/sw/scalefusion/shelf/adapter/ShelfV3Adapter.kt @@ -7,6 +7,7 @@ import androidx.annotation.ColorRes import androidx.core.content.ContextCompat import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.google.android.flexbox.FlexboxLayoutManager import com.shuwei.intelligent.shelves.R import com.shuwei.intelligent.shelves.databinding.ListItemShelfV3Binding import com.sw.scalefusion.shelf.model.SlotModel @@ -15,6 +16,12 @@ import kotlin.math.abs class ShelfV3Adapter(list: MutableList) : BaseQuickAdapter(list) { + /** 每个格口 item 的高度(像素),由 Activity 动态计算 */ + var itemHeight: Int = 0 + + /** 每个格口 item 的宽度(像素),由 Activity 动态计算 */ + var itemWidth: Int = 0 + inner class VH(val binding: ListItemShelfV3Binding) : QuickViewHolder(binding.root) override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { @@ -24,6 +31,12 @@ class ShelfV3Adapter(list: MutableList) : override fun onBindViewHolder(holder: VH, position: Int, item: SlotModel?) { item ?: return + // 动态设置 item 宽高 + val lp = holder.itemView.layoutParams as? FlexboxLayoutManager.LayoutParams + lp?.apply { + if (itemWidth > 0) width = itemWidth + if (itemHeight > 0) height = itemHeight + } val binding = holder.binding // 格口编号 diff --git a/app/src/main/res/layout/list_item_shelf_v3.xml b/app/src/main/res/layout/list_item_shelf_v3.xml index a62e90f..eb5b251 100644 --- a/app/src/main/res/layout/list_item_shelf_v3.xml +++ b/app/src/main/res/layout/list_item_shelf_v3.xml @@ -3,8 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/layoutCard" - android:layout_width="match_parent" - android:layout_height="216dp" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_margin="12dp" app:cardBackgroundColor="@color/bg_card_blue" app:cardCornerRadius="12dp"