Skip to content

折叠和展开

angcyo edited this page Nov 10, 2019 · 2 revisions

常见的场景就是QQ联系人界面

展开状态 折叠状态

注意: 被隐藏Item并没有真正的删除,只是被DslDataFilter过滤掉了. 数据可以通过dslAdapter.adapterItems拿到所有, 界面上展示的只是部分Item

功能使用

只需要item.itemIsGroupHeaditem.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, 恰巧这正是库的细节之处, 专注细节, 关注重点.