-
-
Notifications
You must be signed in to change notification settings - Fork 59
群组功能
angcyo edited this page Nov 10, 2019
·
2 revisions
群组功能
可以将任意连续的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
属性即可归纳为一组.
能够拿到的信息相当丰富, 源码如下:
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
仅测试过纵向
的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()
/**仅有一个*/
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())