Skip to content

情感图状态切换

angcyo edited this page Jul 7, 2020 · 7 revisions

DslAdapterStatusItem

情感图状态控制Item.

情感图, 就是在数据还没有完全获取到时, 界面上显示的一些状态.

如下图:

加载中 空布局 加载失败

以上效果, 是库的默认实现.

注意:

所有默认效果, 完全可自定义, 并且是高度自由控制.

部分实现源码如下:

open class DslAdapterStatusItem : BaseDslStateItem() {

    init {
        itemStateLayoutMap[ADAPTER_STATUS_LOADING] = R.layout.base_loading_layout
        itemStateLayoutMap[ADAPTER_STATUS_ERROR] = R.layout.base_error_layout
        itemStateLayoutMap[ADAPTER_STATUS_EMPTY] = R.layout.base_empty_layout

        itemState = ADAPTER_STATUS_NONE
    }

    companion object {
        /**正常状态, 切换到内容*/
        const val ADAPTER_STATUS_NONE = -1
        /**空数据*/
        const val ADAPTER_STATUS_EMPTY = 0
        /**加载中*/
        const val ADAPTER_STATUS_LOADING = 1
        /**错误*/
        const val ADAPTER_STATUS_ERROR = 2
    }
}

简单自定义

只需要给指定状态的itemStateLayoutMap设置自定义的布局就行.

itemStateLayoutMap[ADAPTER_STATUS_LOADING] = R.layout.base_loading_layout

用您的布局id, 覆盖库中的默认id即可.

也可以用同名的布局xml文件, 覆盖Library中的同名xml文件.

高级自定义

创建一个自定义的DslAdapterStatusItem赋值给dslAdapterStatusItem即可. 如下:

dslAdapter.dslAdapterStatusItem = 自定义的Item

继承DslAdapterStatusItem,重写onItemBind方法, 可以完全覆盖基类的所有实现逻辑.

如果只是想控制不同状态下布局数据, 那么可以重写_onBindStateLayout方法.

override fun _onBindStateLayout(itemHolder: DslViewHolder, state: Int) {
    super._onBindStateLayout(itemHolder, state)
    if (itemState == ADAPTER_STATUS_ERROR) {
        //出现错误后, 触击刷新
        itemHolder.clickItem {
            if (itemState == ADAPTER_STATUS_ERROR) {
                _notifyRefresh(itemHolder)
                itemDslAdapter?.setAdapterStatus(ADAPTER_STATUS_LOADING)
            }
        }
        itemHolder.click(R.id.base_retry_button) {
            itemHolder.clickView(itemHolder.itemView)
        }
    } else if (itemState == ADAPTER_STATUS_LOADING) {
        _notifyRefresh(itemHolder)
    } else {
        itemHolder.itemView.isClickable = false
    }
}

情感图切换

默认是没有情感图状态, 可以通过以下方法切换状态.

dslAdapter.setAdapterStatus(state)

可选的值:

open class DslAdapterStatusItem : BaseDslStateItem() {
    companion object {
        /**正常状态, 切换到内容*/
        const val ADAPTER_STATUS_NONE = -1
        /**空数据*/
        const val ADAPTER_STATUS_EMPTY = 0
        /**加载中*/
        const val ADAPTER_STATUS_LOADING = 1
        /**错误*/
        const val ADAPTER_STATUS_ERROR = 2
    }
}

情感图状态回调

dslAdapter.dslAdapterStatusItem.onBindStateLayout = {itemHolder: DslViewHolder, state: Int->
  //state:对应的状态
  //itemHolder:可以操作视图
}

刷新回调

情感图状态从其他状态(非ADAPTER_STATUS_LOADING状态)切换至ADAPTER_STATUS_LOADING状态时, 触发的回调.

使用onRefresh属性, 设置回调处理方法.

dslAdapter.dslAdapterStatusItem.onRefresh = {
    //刷新, 这里可以处理一些界面刷新, 数据刷新, 请求列表第一页的数据等
    //类似于下拉刷新控件的回调
}