package cn.flightfeather.thirdapp.view.recyclerview
|
|
import android.content.Context
|
import cn.flightfeather.thirdapp.common.net.ResultCallBack
|
import org.jetbrains.anko.runOnUiThread
|
|
/**
|
* @author riku
|
* Date: 2020/12/24
|
* 列表数据加载逻辑
|
*/
|
abstract class DataLoadModel<T>(private val application: Context) : ResultCallBack<List<T>> {
|
var dataList = listOf<T>()
|
|
private var loadState = LoadState.NONE
|
|
private var needMore = true
|
|
private var totalPage: Int = -1
|
|
private var currentPage = 1
|
|
var loadStateListener: (loadState: LoadState) -> Unit = {}
|
|
var dataLoadListener: (dataList: List<T>) -> Unit = {}
|
|
/**
|
* 数据重载
|
*/
|
open fun refresh() {
|
if (isLoading()) {
|
return
|
}
|
currentPage = 1
|
loadState = LoadState.Refresh
|
onLoadState(loadState)
|
loadDataByRefresh()
|
}
|
|
/**
|
* 加载更多
|
*/
|
open fun loadMore() {
|
if (isLoading()) {
|
return
|
}
|
currentPage++
|
loadState = LoadState.LoadMore
|
onLoadState(loadState)
|
loadDataByLoadMore(currentPage)
|
}
|
|
/**
|
* 加载完成,刷新加载状态
|
*/
|
private fun completeLoadData(isFail: Boolean = false) {
|
loadState = when (loadState) {
|
LoadState.Refresh -> if (!isFail) LoadState.RefreshDone else LoadState.RefreshFail
|
LoadState.LoadMore -> if (!isFail) {
|
if (needMore) {
|
LoadState.LoadMoreComplete
|
} else {
|
LoadState.LoadMoreEnd
|
}
|
} else LoadState.LoadMoreFail
|
LoadState.NONE -> LoadState.RefreshDone
|
else -> LoadState.RefreshDone
|
}
|
onLoadState(loadState)
|
}
|
|
/**
|
* 刷新状态判断
|
*/
|
private fun isLoading(): Boolean =
|
loadState == LoadState.Refresh || loadState == LoadState.LoadMore
|
|
/**
|
* 数据更新
|
*/
|
private fun commitResult(result: List<T>?) {
|
result?.let {
|
dataList = it
|
onDataLoad(dataList)
|
}
|
}
|
|
//根据分页判断当前执行的是刷新还是加载更多
|
fun isFirstData(): Boolean = currentPage == 1
|
|
override fun onPage(current: Int, total: Int) {
|
if (total > 0) {
|
totalPage = total
|
}
|
if (current > 0) {
|
currentPage = current
|
}
|
application.runOnUiThread {
|
needMore = (currentPage < totalPage)
|
}
|
}
|
|
override fun onSuccess(result: List<T>?) {
|
commitResult(result)
|
completeLoadData()
|
}
|
|
override fun onCacheSuccess(result: List<T>?) {
|
if (isFirstData()) {
|
application.runOnUiThread {
|
result?.let {
|
commitResult(it)
|
}
|
}
|
}
|
}
|
|
override fun onFailure() {
|
completeLoadData(true)
|
//获取新的下页信息失败时,分页数还原
|
if (currentPage > 2) {
|
currentPage--
|
}
|
}
|
|
private fun onLoadState(loadState: LoadState) = loadStateListener(loadState)
|
|
private fun onDataLoad(dataList: List<T>) = dataLoadListener(dataList)
|
|
abstract fun loadDataByRefresh()
|
|
abstract fun loadDataByLoadMore(page: Int)
|
|
}
|