# 群组功能

群组功能可以将任意连续的Item归纳为一组.

同一组之内Item, 可以通过动态计算属性itemGroupParams拿到所有群组参数ItemGroupParams信息.

要将Item归纳为一组, 只需要实现isItemInGroups方法:

var isItemInGroups: (newItem: DslAdapterItem) -> Boolean = {
    var result = false
    for (group in it.itemGroups) {
        result = result || itemGroups.contains(group)
        if (result) {
            break
        }
    }
    result
}

默认已经提供了实现方法, 只需要设置相同itemGroups属性即可归纳为一组.

# ItemGroupParams

能够拿到的信息相当丰富, 源码如下:

data class ItemGroupParams(
    var indexInGroup: Int = RecyclerView.NO_POSITION,
    var currentAdapterItem: DslAdapterItem? = null,
    var groupItems: MutableList<DslAdapterItem> = mutableListOf(),

    /**仅在使用了[android.support.v7.widget.GridLayoutManager]时有效*/
    var edgeInGrid: Int = EDGE_NONE,
    var edgeInGroup: Int = EDGE_NONE,
    var edgeGridParams: EdgeGridParams = EdgeGridParams()
)

data class EdgeGridParams(

    /**相对于整个网格系统的边界*/
    var edgeInGrid: Int = EDGE_NONE,

    /**在同一组中的边界*/
    var edgeInGroup: Int = EDGE_NONE,

    //当前位置的参数
    var currentSpanParams: SpanParams = SpanParams(),
    //下一个位置的参数
    var nextSpanParams: SpanParams = SpanParams(),

    //分组中第一个位置的数据
    var firstSpanParams: SpanParams = SpanParams(),
    //分组中最后一个位置的数据
    var lastSpanParams: SpanParams = SpanParams()
)

data class SpanParams(
    //当前的位置
    var itemPosition: Int = RecyclerView.NO_POSITION,
    //当前的索引在群组中
    var indexInGroup: Int = RecyclerView.NO_POSITION,
    //在第几行
    var spanGroupIndex: Int = RecyclerView.NO_POSITION,
    //在第几列
    var spanIndex: Int = RecyclerView.NO_POSITION,
    //占多少列
    var spanSize: Int = RecyclerView.NO_POSITION
)

const val EDGE_NONE = 0x00
//左边界
const val EDGE_LEFT = 0x01
//顶边界
const val EDGE_TOP = 0x02
//右边界
const val EDGE_RIGHT = 0x04
//底边界
const val EDGE_BOTTOM = 0x08

//[edgeInGroup]特有的边界, 左上, 右上, 左下, 右下
const val EDGE_LEFT_TOP = 0x10
const val EDGE_RIGHT_TOP = 0x20
const val EDGE_LEFT_BOTTOM = 0x40
const val EDGE_RIGHT_BOTTOM = 0x80
//在一组中的顶部
const val EDGE_GROUP_TOP = 0x100
//在一组中的底部
const val EDGE_GROUP_BOTTOM = 0x200

# 常用的群组信息api

仅测试过纵向LinearLayoutManager:

群组当中是否仅有自身:

itemGroupParams.isOnlyOne()

在群组中的索引位置:

itemGroupParams.indexInGroup

是否在群组中的第一个位置:

itemGroupParams.isFirstPosition()

是否在群组中的最后一个位置:

itemGroupParams.isLastPosition()

如果是在GridLayoutManager, 还会有针对Grid布局的特殊信息:

是否在网格群组中的4个角上:

//左上角
itemGroupParams.isEdgeGroupLeftTop()
//右上角
itemGroupParams.isEdgeGroupRightTop()
//左下角
itemGroupParams.isEdgeGroupLeftBottom()
//右下角
itemGroupParams.isEdgeGroupRightBottom()

是否在网格群组中的4个边上:(撑满后的边界)

//左边
itemGroupParams.isEdgeLeft()
//右边, 全屏的右边.
itemGroupParams.isEdgeRight()
//顶边
itemGroupParams.isEdgeTop()
//底边
itemGroupParams.isEdgeBottom()

# 更多扩展信息api

/**仅有一个*/
fun ItemGroupParams.isOnlyOne(): Boolean = groupItems.size == 1

/**是否是第一个位置*/
fun ItemGroupParams.isFirstPosition(): Boolean = indexInGroup == 0 && currentAdapterItem != null

/**是否是最后一个位置*/
fun ItemGroupParams.isLastPosition(): Boolean =
    currentAdapterItem != null && indexInGroup == groupItems.lastIndex


/**网格布局, 边界扩展方法*/
//是否在4条边上
fun ItemGroupParams.isEdgeLeft(): Boolean = edgeInGrid.have(EDGE_LEFT)
fun ItemGroupParams.isEdgeRight(): Boolean = edgeInGrid.have(EDGE_RIGHT)
fun ItemGroupParams.isEdgeTop(): Boolean = edgeInGrid.have(EDGE_TOP)
fun ItemGroupParams.isEdgeBottom(): Boolean = edgeInGrid.have(EDGE_BOTTOM)

//全屏占满整个一行
fun ItemGroupParams.isEdgeHorizontal(): Boolean = isEdgeLeft() && isEdgeRight()
//全屏占满整个一列
fun ItemGroupParams.isEdgeVertical(): Boolean = isEdgeTop() && isEdgeBottom()

//是否在4个角
fun ItemGroupParams.isEdgeGroupLeftTop(): Boolean = edgeInGroup.have(EDGE_LEFT_TOP)
fun ItemGroupParams.isEdgeGroupRightTop(): Boolean = edgeInGroup.have(EDGE_RIGHT_TOP)
fun ItemGroupParams.isEdgeGroupLeftBottom(): Boolean = edgeInGroup.have(EDGE_LEFT_BOTTOM)
fun ItemGroupParams.isEdgeGroupRightBottom(): Boolean = edgeInGroup.have(EDGE_RIGHT_BOTTOM)

//在一组中的第一行
fun ItemGroupParams.isEdgeGroupTop(): Boolean = edgeInGroup.have(EDGE_GROUP_TOP)
//在一组中的最后一行
fun ItemGroupParams.isEdgeGroupBottom(): Boolean = edgeInGroup.have(EDGE_GROUP_BOTTOM)

//占满整个一行(允许非全屏)
fun ItemGroupParams.isEdgeGroupHorizontal(): Boolean =
    (isEdgeGroupLeftTop() && isEdgeGroupRightTop()) || (isEdgeGroupLeftBottom() && isEdgeGroupRightBottom())

//占满整个一列(允许非全屏)
fun ItemGroupParams.isEdgeGroupVertical(): Boolean =
    (isEdgeGroupLeftTop() && isEdgeGroupLeftBottom()) || (isEdgeGroupRightTop() && isEdgeGroupRightBottom())