60 lines
1.5 KiB
Kotlin
60 lines
1.5 KiB
Kotlin
|
|
package com.aiosman.ravenow.entity
|
||
|
|
|
||
|
|
import androidx.compose.runtime.getValue
|
||
|
|
import androidx.compose.runtime.mutableStateOf
|
||
|
|
import androidx.compose.runtime.setValue
|
||
|
|
import com.aiosman.ravenow.data.ListContainer
|
||
|
|
|
||
|
|
abstract class DataLoader<T,ET> {
|
||
|
|
var list: MutableList<T> = mutableListOf()
|
||
|
|
var page by mutableStateOf(1)
|
||
|
|
var total by mutableStateOf(0)
|
||
|
|
var pageSize by mutableStateOf(10)
|
||
|
|
var hasNext by mutableStateOf(true)
|
||
|
|
var onListChanged: ((List<T>) -> Unit)? = null
|
||
|
|
private var firstLoad = true
|
||
|
|
|
||
|
|
|
||
|
|
abstract suspend fun fetchData(
|
||
|
|
page: Int, pageSize: Int, extra: ET
|
||
|
|
): ListContainer<T>
|
||
|
|
|
||
|
|
suspend fun loadData(
|
||
|
|
extra: ET
|
||
|
|
) {
|
||
|
|
if (!firstLoad) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
firstLoad = false
|
||
|
|
val result = fetchData(page, pageSize, extra)
|
||
|
|
list = result.list.toMutableList()
|
||
|
|
this.page = page
|
||
|
|
this.total = result.total
|
||
|
|
this.pageSize = pageSize
|
||
|
|
this.hasNext = result.list.size == pageSize
|
||
|
|
onListChanged?.invoke(list)
|
||
|
|
}
|
||
|
|
|
||
|
|
suspend fun loadMore(extra: ET) {
|
||
|
|
if (firstLoad) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if (!hasNext) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
val result = fetchData(page + 1, pageSize, extra)
|
||
|
|
list.addAll(result.list)
|
||
|
|
page += 1
|
||
|
|
hasNext = result.list.size == pageSize
|
||
|
|
onListChanged?.invoke(list)
|
||
|
|
}
|
||
|
|
|
||
|
|
fun clear() {
|
||
|
|
list.clear()
|
||
|
|
page = 1
|
||
|
|
total = 0
|
||
|
|
pageSize = 10
|
||
|
|
hasNext = true
|
||
|
|
firstLoad = true
|
||
|
|
}
|
||
|
|
}
|