riku
2021-02-25 e102578ebfc95c27aeb13dce13fb82af53a2bead
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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)
 
}