Skip to content

加载更多功能

angcyo edited this page Nov 7, 2019 · 3 revisions

DslLoadMoreItem

加载更多状态控制Item.

加载更多的实现方式, 是在Adapter的底部, 插入一个DslLoadMoreItem实现的.

如下图:

加载更多中 无更多 加载失败

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

注意:

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

部分实现源码如下:

open class DslLoadMoreItem : BaseDslStateItem() {

    init {
        itemStateLayoutMap[ADAPTER_LOAD_NORMAL] = R.layout.base_loading_layout
        itemStateLayoutMap[ADAPTER_LOAD_LOADING] = R.layout.base_loading_layout
        itemStateLayoutMap[ADAPTER_LOAD_NO_MORE] = R.layout.base_no_more_layout
        itemStateLayoutMap[ADAPTER_LOAD_ERROR] = R.layout.base_error_layout
        itemStateLayoutMap[ADAPTER_LOAD_RETRY] = R.layout.base_error_layout

        onItemViewDetachedToWindow = {
            if (itemEnableLoadMore) {
                //加载失败时, 下次是否还需要加载更多?
                if (itemState == ADAPTER_LOAD_ERROR) {
                    itemState =
                        ADAPTER_LOAD_RETRY
                }
            }
        }
        thisAreContentsTheSame = { _, _ ->
            false
        }
    }

    companion object {
        /**正常状态, 等待加载更多*/
        const val ADAPTER_LOAD_NORMAL = 0
        /**加载更多中*/
        const val ADAPTER_LOAD_LOADING = 1
        /**无更多*/
        const val ADAPTER_LOAD_NO_MORE = 2
        /**加载失败*/
        const val ADAPTER_LOAD_ERROR = 10
        /**加载失败, 自动重试中*/
        const val ADAPTER_LOAD_RETRY = 11
    }
}

简单自定义

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

itemStateLayoutMap[ADAPTER_LOAD_LOADING] = R.layout.base_loading_layout

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

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

高级自定义

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

dslAdapter.dslLoadMoreItem = 自定义的Item

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

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

override fun _onBindStateLayout(itemHolder: DslViewHolder, state: Int) {
    super._onBindStateLayout(itemHolder, state)
    if (itemEnableLoadMore) {
        if (itemState == ADAPTER_LOAD_NORMAL || itemState == ADAPTER_LOAD_LOADING) {
            _notifyLoadMore(itemHolder)
        } else if (itemState == ADAPTER_LOAD_ERROR) {
            itemHolder.clickItem {
                if (itemState == ADAPTER_LOAD_ERROR || itemState == ADAPTER_LOAD_RETRY) {
                    //失败的情况下, 点击触发重新加载
                    _notifyLoadMore(itemHolder)
                    updateAdapterItem()
                }
            }
        } else {
            itemHolder.itemView.isClickable = false
        }
    } else {
        itemHolder.itemView.isClickable = false
    }
}

激活/关闭

默认情况下, 没有激活加载更多功能.可以通过以下方法激活:

dslAdapter.setLoadMoreEnable(true)

加载更多状态切换

可以通过以下方法切换状态.

dslAdapter.setLoadMore(state)

可选的值:

open class DslLoadMoreItem : BaseDslStateItem() {
    companion object {
        /**正常状态, 等待加载更多*/
        const val ADAPTER_LOAD_NORMAL = 0
        /**加载更多中*/
        const val ADAPTER_LOAD_LOADING = 1
        /**无更多*/
        const val ADAPTER_LOAD_NO_MORE = 2
        /**加载失败*/
        const val ADAPTER_LOAD_ERROR = 10
    }
}

加载更多回调

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

dslAdapter.dslLoadMoreItem.onLoadMore = {
    //加载更多
}