# 展开/折叠
常见的场景就是QQ联系人界面
| 展开状态 | 折叠状态 |
|---|---|
![]() | ![]() |
注意:
被隐藏的Item并没有真正的删除,只是被DslDataFilter过滤掉了.
数据可以通过dslAdapter.adapterItems拿到所有, 界面上展示的只是部分Item
# 功能使用
只需要item.itemIsGroupHead和item.itemGroupExtend属性配合即可.
需要开启分组的item设置itemIsGroupHead=true,
需要被折叠的item无需配置.
当分组的item设置itemGroupExtend=false的时候, 就会折叠这个分组.
折叠的item计算公式:
从当前
item, 一直到下一个具有itemIsGroupHead=true之间所有的item, 都将被隐藏.
# 代码介绍
fun DslAdapter.来点数据() {
val dslAdapter = this
for (i in 0..5) {
dslAdapter.dslItem(R.layout.item_group_head) {
itemIsGroupHead = true //注意此处, 开启分组标识.
onItemBindOverride = { itemHolder, itemPosition, adapterItem ->
itemHolder.tv(R.id.fold_button).text =
if (itemGroupExtend) "折叠 $itemPosition" else "展开 $itemPosition"
itemHolder.click(R.id.fold_button) {
itemGroupExtend = !itemGroupExtend //折叠/展开 功能切换
}
}
}
dslAdapter.dslTextItem()
dslAdapter.dslItem(R.layout.item_text_layout) {
onItemBindOverride = { itemHolder, itemPosition, _ ->
itemHolder.v<TextView>(R.id.text_view).text = "文本位置:$itemPosition"
}
}
for (j in 0..0) {
dslAdapter.dslImageItem()
dslAdapter.dslItem(R.layout.item_image_layout) {
onItemBindOverride = { itemHolder, itemPosition, _ ->
itemHolder.v<TextView>(R.id.text_view).text = "文本位置:$itemPosition"
}
}
}
}
}
# 自定义
如果想实现自己的分组计算方法, 可以继承DslDataFilter重写filterItemGroupList, 返回过滤后的数据列表即可.
最后赋值给dslAdapter.dslDataFilter变量方可生效
# 注意
当折叠Item时, 由于默认使用的是Diff算法刷新界面的, 所有默认只会调用notifyItemRemoved移除被折叠的Item,
所以后面的Item并不会收到notifyItemChanged事件, 也就不会刷新界面.
如果想要修改默认行为, 可以实现dsl.thisAreContentsTheSame计算方法, return false, 就可以强制刷新除notifyItemRemoved外的所有可见Item.
这并非库的BUG, 恰巧这正是库的细节之处, 专注细节, 关注重点.

