# 加载更多
# 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 = {
//加载更多
}