修复了排序问题
This commit is contained in:
@@ -23,10 +23,10 @@ import com.sw.platecabinet.databinding.ItemBindViewBinding
|
||||
import com.sw.platecabinet.ext.formatNumber
|
||||
import com.sw.platecabinet.ext.maskName
|
||||
import com.sw.platecabinet.model.response.EquipmentUserInfo
|
||||
import com.sw.platecabinet.utils.ListArrangementUtil
|
||||
import kotlinx.coroutines.flow.drop
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
import kotlin.math.ceil
|
||||
|
||||
/**
|
||||
* 餐盘柜绑定的用户列表界面
|
||||
@@ -43,7 +43,6 @@ class SettingListFragment :
|
||||
* 垂直滚动的adapter
|
||||
*/
|
||||
private var itemAdapter: GenericItemAdapter<EquipmentUserInfo, ItemBindViewBinding>? = null
|
||||
private val itemsPerPage = 2 * GlobalData.arrayVertical // 每行2个,每列11个,共22个
|
||||
|
||||
override fun registerDataChange() {
|
||||
super.registerDataChange()
|
||||
@@ -179,63 +178,27 @@ class SettingListFragment :
|
||||
}
|
||||
}
|
||||
|
||||
fun reorderListAutoFill(
|
||||
list: List<EquipmentUserInfo>,
|
||||
columns: Int,
|
||||
defaultValue: EquipmentUserInfo = EquipmentUserInfo()
|
||||
): List<EquipmentUserInfo> {
|
||||
// 填充缺失的数据,确保能被 columns 整除
|
||||
val filledList = if (list.size % columns != 0) {
|
||||
list + List(columns - (list.size % columns)) { defaultValue }
|
||||
} else {
|
||||
list
|
||||
}
|
||||
|
||||
val chunks = filledList.chunked(columns)
|
||||
return (0 until columns)
|
||||
.windowed(2, 2, partialWindows = true)
|
||||
.flatMap { group ->
|
||||
when (group.size) {
|
||||
2 -> chunks.flatMap { listOf(it[group[0]], it[group[1]]) }
|
||||
1 -> chunks.flatMap {
|
||||
listOf(
|
||||
it[group[0]],
|
||||
EquipmentUserInfo(equipmentBoxCode = null)
|
||||
)
|
||||
}.dropLast(1)
|
||||
|
||||
else -> error("Unexpected group size")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun interleaveEquipmentUsers(users: List<EquipmentUserInfo>): List<EquipmentUserInfo> {
|
||||
require(users.size % 2 == 0) { "列表长度必须是偶数" }
|
||||
|
||||
val half = users.size / 2
|
||||
val firstHalf = users.take(half)
|
||||
val secondHalf = users.drop(half)
|
||||
|
||||
return firstHalf.zip(secondHalf) { a, b -> listOf(a, b) }.flatten()
|
||||
}
|
||||
|
||||
fun updateAdapter(items: List<EquipmentUserInfo>) {
|
||||
val itemsPerPage = 2 * GlobalData.arrayVertical // 每行2个,每列11个,共22个
|
||||
if (GlobalData.arrayCross > 2) {
|
||||
// 多recyclerview
|
||||
var pages = if (items.size > itemsPerPage) {
|
||||
if (GlobalData.arrayMode == 1) {
|
||||
val newItems = reorderListAutoFill(items, GlobalData.arrayCross)
|
||||
newItems.chunked(itemsPerPage)
|
||||
} else {
|
||||
if (GlobalData.arrayMode == 0) {
|
||||
val pageList = items.chunked(itemsPerPage)
|
||||
pageList.mapIndexed { index, it ->
|
||||
var itemList: MutableList<EquipmentUserInfo> = it.toMutableList()
|
||||
if (index == pageList.size - 1) {
|
||||
itemList = (itemList + List(GlobalData.arrayVertical) {
|
||||
// 补全剩余item
|
||||
itemList = (itemList + List(itemsPerPage - itemList.size) {
|
||||
EquipmentUserInfo()
|
||||
}) as MutableList<EquipmentUserInfo>
|
||||
}
|
||||
convertToColumnFirst(itemList, GlobalData.arrayVertical)
|
||||
ListArrangementUtil.convertToColumnFirst(itemList, GlobalData.arrayVertical)
|
||||
}
|
||||
} else {
|
||||
val newItems =
|
||||
ListArrangementUtil.horizontalSortPageItem(items, GlobalData.arrayCross)
|
||||
newItems.chunked(itemsPerPage)
|
||||
}
|
||||
} else {
|
||||
listOf(
|
||||
@@ -244,28 +207,15 @@ class SettingListFragment :
|
||||
}
|
||||
pageAdapter?.updatePages(pages)
|
||||
} else {
|
||||
// 单 recyclerview
|
||||
var pages = items
|
||||
if (GlobalData.arrayMode == 0) {
|
||||
pages = interleaveEquipmentUsers(pages)
|
||||
pages = ListArrangementUtil.verticalSortItem(pages)
|
||||
}
|
||||
itemAdapter?.updateData(pages)
|
||||
}
|
||||
binding.mainRecyclerView.scrollToPosition(0)
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新排列数组
|
||||
*/
|
||||
private fun convertToColumnFirst(
|
||||
original: List<EquipmentUserInfo>,
|
||||
cols: Int
|
||||
): List<EquipmentUserInfo> {
|
||||
val rows = ceil(original.size.toDouble() / cols).toInt()
|
||||
return List(original.size) { pos ->
|
||||
val row = pos % rows
|
||||
val col = pos / rows
|
||||
val originalPos = col + row * cols
|
||||
original[originalPos]
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user