refactor(home): 用FlexboxLayoutManager替换GridLayoutManager,支持动态行列布局
FlexboxLayoutManager(COLUMN+WRAP)天然列优先排列,数据无需重排。 item宽高在拿到接口行列数后直接计算,适配任意rows×cols配置。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -87,6 +87,8 @@ dependencies {
|
|||||||
|
|
||||||
implementation("org.greenrobot:eventbus:3.3.1")
|
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("io.github.jeremyliao:live-event-bus-x:1.8.0")
|
||||||
// implementation("com.hoho:android-usb-serial:1.3.0")
|
// implementation("com.hoho:android-usb-serial:1.3.0")
|
||||||
// implementation("io.github.jeadyx:jserialport:1.5")
|
// implementation("io.github.jeadyx:jserialport:1.5")
|
||||||
|
|||||||
@@ -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.C_TEMP_CMD
|
||||||
import com.shuwei.intelligent.shelves.serial.ProtocolConstants.START_TEMP_CTRL_CMD
|
import com.shuwei.intelligent.shelves.serial.ProtocolConstants.START_TEMP_CTRL_CMD
|
||||||
import com.shuwei.intelligent.shelves.serial.ScaleManager
|
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.IntervalExecutor
|
||||||
|
import com.shuwei.intelligent.shelves.utils.ext.dp
|
||||||
import com.shuwei.intelligent.shelves.utils.ext.gone
|
import com.shuwei.intelligent.shelves.utils.ext.gone
|
||||||
import com.shuwei.intelligent.shelves.utils.ext.toast
|
import com.shuwei.intelligent.shelves.utils.ext.toast
|
||||||
import com.shuwei.intelligent.shelves.utils.ext.visible
|
import com.shuwei.intelligent.shelves.utils.ext.visible
|
||||||
@@ -153,10 +156,15 @@ class HomeV3Activity : BaseActivity() {
|
|||||||
log("updateUI: slots=${slots.size}, rows=$rows, columns=$columns")
|
log("updateUI: slots=${slots.size}, rows=$rows, columns=$columns")
|
||||||
|
|
||||||
list.clear()
|
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) {
|
if (binding.rvShelf.adapter == null) {
|
||||||
initRecyclerView(columns)
|
initRecyclerView()
|
||||||
} else {
|
} else {
|
||||||
shelfAdapter.notifyDataSetChanged()
|
shelfAdapter.notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
@@ -258,8 +266,11 @@ class HomeV3Activity : BaseActivity() {
|
|||||||
shelfAdapter.notifyItemChanged(position)
|
shelfAdapter.notifyItemChanged(position)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initRecyclerView(columns: Int) {
|
private fun initRecyclerView() {
|
||||||
val layoutManager = GridLayoutTool.getLayoutManagerV2(this, columns = columns)
|
val layoutManager = FlexboxLayoutManager(this).apply {
|
||||||
|
flexDirection = FlexDirection.COLUMN
|
||||||
|
flexWrap = FlexWrap.WRAP
|
||||||
|
}
|
||||||
binding.rvShelf.let {
|
binding.rvShelf.let {
|
||||||
it.layoutManager = layoutManager
|
it.layoutManager = layoutManager
|
||||||
it.adapter = shelfAdapter
|
it.adapter = shelfAdapter
|
||||||
@@ -345,7 +356,7 @@ class HomeV3Activity : BaseActivity() {
|
|||||||
/** 全量同步格口重量 */
|
/** 全量同步格口重量 */
|
||||||
private fun syncShelfGoodsToServer() {
|
private fun syncShelfGoodsToServer() {
|
||||||
if (list.isEmpty()) return
|
if (list.isEmpty()) return
|
||||||
val submitList = GridLayoutTool.submitListSortV3(list)
|
val submitList = list.sortedBy { it.slotNo.toIntOrNull() ?: 0 }
|
||||||
viewModel.syncWeight(
|
viewModel.syncWeight(
|
||||||
SyncWeightRequest(
|
SyncWeightRequest(
|
||||||
cabinetType = cabinetType,
|
cabinetType = cabinetType,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import androidx.annotation.ColorRes
|
|||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.chad.library.adapter4.BaseQuickAdapter
|
import com.chad.library.adapter4.BaseQuickAdapter
|
||||||
import com.chad.library.adapter4.viewholder.QuickViewHolder
|
import com.chad.library.adapter4.viewholder.QuickViewHolder
|
||||||
|
import com.google.android.flexbox.FlexboxLayoutManager
|
||||||
import com.shuwei.intelligent.shelves.R
|
import com.shuwei.intelligent.shelves.R
|
||||||
import com.shuwei.intelligent.shelves.databinding.ListItemShelfV3Binding
|
import com.shuwei.intelligent.shelves.databinding.ListItemShelfV3Binding
|
||||||
import com.sw.scalefusion.shelf.model.SlotModel
|
import com.sw.scalefusion.shelf.model.SlotModel
|
||||||
@@ -15,6 +16,12 @@ import kotlin.math.abs
|
|||||||
class ShelfV3Adapter(list: MutableList<SlotModel>) :
|
class ShelfV3Adapter(list: MutableList<SlotModel>) :
|
||||||
BaseQuickAdapter<SlotModel, ShelfV3Adapter.VH>(list) {
|
BaseQuickAdapter<SlotModel, ShelfV3Adapter.VH>(list) {
|
||||||
|
|
||||||
|
/** 每个格口 item 的高度(像素),由 Activity 动态计算 */
|
||||||
|
var itemHeight: Int = 0
|
||||||
|
|
||||||
|
/** 每个格口 item 的宽度(像素),由 Activity 动态计算 */
|
||||||
|
var itemWidth: Int = 0
|
||||||
|
|
||||||
inner class VH(val binding: ListItemShelfV3Binding) : QuickViewHolder(binding.root)
|
inner class VH(val binding: ListItemShelfV3Binding) : QuickViewHolder(binding.root)
|
||||||
|
|
||||||
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH {
|
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH {
|
||||||
@@ -24,6 +31,12 @@ class ShelfV3Adapter(list: MutableList<SlotModel>) :
|
|||||||
|
|
||||||
override fun onBindViewHolder(holder: VH, position: Int, item: SlotModel?) {
|
override fun onBindViewHolder(holder: VH, position: Int, item: SlotModel?) {
|
||||||
item ?: return
|
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
|
val binding = holder.binding
|
||||||
|
|
||||||
// 格口编号
|
// 格口编号
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/layoutCard"
|
android:id="@+id/layoutCard"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="0dp"
|
||||||
android:layout_height="216dp"
|
android:layout_height="0dp"
|
||||||
android:layout_margin="12dp"
|
android:layout_margin="12dp"
|
||||||
app:cardBackgroundColor="@color/bg_card_blue"
|
app:cardBackgroundColor="@color/bg_card_blue"
|
||||||
app:cardCornerRadius="12dp"
|
app:cardCornerRadius="12dp"
|
||||||
|
|||||||
Reference in New Issue
Block a user