如何为span count为2的RecyclerView GridLayoutManager对角线列表项着色
GridLayoutManager(spanCount=2)列表项对角线着色实现方案
核心逻辑
我们可以通过列表项的position直接推导所属颜色分组,无需额外存储状态,核心判断逻辑完全匹配你给出的着色规则:
- 满足
(position + position / 2) % 2 == 0的位置(0、3、4、7、8……)归为第一组,使用第一种颜色 - 其余位置(1、2、5、6、9、10……)归为第二组,使用第二种颜色
可代入任意位置验证匹配性:
| position | 计算结果 | 所属分组 |
|---|---|---|
| 0 | (0+0)%2=0 | 第一组 |
| 1 | (1+0)%2=1 | 第二组 |
| 2 | (2+1)%2=1 | 第二组 |
| 3 | (3+1)%2=0 | 第一组 |
| 4 | (4+2)%2=0 | 第一组 |
| 7 | (7+3)%2=0 | 第一组 |
| 9 | (9+4)%2=1 | 第二组 |
代码示例(Kotlin)
在RecyclerView.Adapter的onBindViewHolder方法中添加如下逻辑:
override fun onBindViewHolder(holder: MyViewHolder, position: Int) { // 可替换为实际使用的色值 val colorGroup1 = ContextCompat.getColor(context, R.color.color_first_group) val colorGroup2 = ContextCompat.getColor(context, R.color.color_second_group) // 替换为列表项的根布局 val itemRoot = holder.itemView if ((position + position / 2) % 2 == 0) { itemRoot.setBackgroundColor(colorGroup1) } else { itemRoot.setBackgroundColor(colorGroup2) } // 其余列表项绑定逻辑 }
代码示例(Java)
@Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { // 可替换为实际使用的色值 int colorGroup1 = ContextCompat.getColor(context, R.color.color_first_group); int colorGroup2 = ContextCompat.getColor(context, R.color.color_second_group); // 替换为列表项的根布局 View itemRoot = holder.itemView; if ((position + position / 2) % 2 == 0) { itemRoot.setBackgroundColor(colorGroup1); } else { itemRoot.setBackgroundColor(colorGroup2); } // 其余列表项绑定逻辑 }
注意事项
- 如果列表添加了头部、尾部装饰,需要将对应偏移量计入position的计算
- 该规则仅适配spanCount固定为2的网格布局
内容的提问来源于stack exchange,提问作者Suman Radhakrishnan
相关产品推荐
相关产品推荐

