# 展开/折叠
常见的场景就是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
, 恰巧这正是库的细节之处
, 专注细节
, 关注重点
.