gpt4 book ai didi

java - 如何在 GridLayoutManager 中改变每条偶数行的方向?

转载 作者:行者123 更新时间:2023-12-02 12:51:45 25 4
gpt4 key购买 nike

我有 layoutManager = GridLayoutManager(context, 3)
如何使每条奇数线方向从左到右和偶数线 - 从右到左

看起来像:

0 -> 1 -> 2

5 <- 4 <- 3

6 -> 7 -> 8

etc...

有什么想法吗?

最佳答案

免责声明:我正在使用手机,因此未经测试

如果你自己写RecyclerView.Adapter ,您可以覆盖 bind 方法以“以错误的顺序”查找数据:

Pos0:数据 0 -> Pos1:数据 1 -> Pos2:数据 2
位置 3:数据 5 -> Pos4:数据 4 -> Pos5:数据 3
Pos6:数据 6 -> Pos7:数据 7 -> Pos8:数据 8
Pos9: 间隔 -> Pos10: 间隔 -> Pos11: 数据 9

我假设您正在将一些数据集合传递给您的适配器;我们还需要列数:

class SnakingAdapter(
private val data: SomeCollection<SomeObject>,
private val cols: Int
) : RecyclerView.Adapter<SomeViewHolder> { ... }

首先,让我们处理您的 RecyclerView 以不完整的偶数行结束的边缘情况。例如,如果您有 10 个数据项(最大索引 9),我假设您想要右侧的最后一项(而不是左侧)。我们可以通过在它前面创建 2 个“spacer”项目来做到这一点:
private val twoRows = cols * 2 // left > right & right > left
private val remainder = data.count() % twoRows

// If last row is an odd row => no "spacers"
// If last row is complete => no "spacers"
private val needSpacers = remainder > cols
private val paddedCount =
if(needSpacers) (data.count() / twoRows + 1) * twoRows
else data.count()
private val firstSpacerPosition = data.count() / cols * cols
private val spacerPositions =
if(needSpacers) List(paddedCount - data.count()) { firstSpacerPosition + it }
else emptyList<Int>()

override fun getItemCount(): Int = paddedCount

override fun getItemViewType(position: Int): Int =
if(spacerPositions.contains(position)) 2
else 1

override onCreateViewHolder(parent: ViewGroup, viewType: Int) = when(viewType) {
1 => // create a normal item view & ViewHolder
2 => // create a "spacer" item view & ViewHolder
}

接下来我们需要为偶数行绑定(bind)“错误”的数据:
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position Int) { 
// If spacer, do nothing
if(spacerPositions.contains(position)) return

// If even row, flip the order of the data
val twoRowPos = position % twoRows
val rowTwomidpoint = cols / 2 + cols // TODO: extract as a field
val altPosition =
if (twoRowPos >= cols) (position - 2 * (twoRowPos - rowTwoMidpoint)) // TODO: correct for odd cols; should fix for even cols
else position

val data = dataSource.get(altPosition)
// bind data to view holder here
}

关于java - 如何在 GridLayoutManager 中改变每条偶数行的方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60383187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com