Pagging3分页写起来很麻烦,这里分享一下我的简化开发的方法,思路就是把获取数据的函数分离出来
首先定义一个基础的PagingSource接收任意类型的数据条目类型,可以看出这里将获取key的函数都实现好了,我们就不用关心了,只需要关注open suspend fun getData类的实现即可
另外推荐一个Kotlin Android开发的工具包 https://github.com/ym6745476/kohelper 这里封装好了一些工具类,可以简化开发过程。
open class KoPagingSource<T : Any>(private val pageSize:Int) : PagingSource<Int, T>() {
override fun getRefreshKey(state: PagingState<Int, T>): Int? {
return null
}
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, T> {
return try {
val page = params.key ?: 1
val loadSize = params.loadSize
var list = getData(page,loadSize)
return LoadResult.Page(
data = list,
prevKey = getPrevKey(page),
nextKey = getNextKey(list.size,loadSize,page,pageSize)
)
} catch (e: Exception) {
e.printStackTrace()
LoadResult.Error(e)
}
}
open suspend fun getData(page:Int, loadSize:Int):List<T>{
return ArrayList()
}
fun getPrevKey(page:Int):Int?{
var prevKey: Int?
if(page == 1){
prevKey = null
}else{
prevKey = page - 1
}
return prevKey
}
fun getNextKey(size:Int,loadSize:Int,page:Int,pageSize:Int):Int?{
var nextKey: Int?
if(page == 1){
nextKey = if (size < pageSize) null else loadSize/pageSize + 1
}else{
nextKey = if (size < pageSize) null else page + 1
}
return nextKey
}
}
KoPagingSource是我们封装好的用于分页的基础类,我们自己的业务代码继承自这个KoPagingSource<News>(pageSize)就可以了。
class NewsPagingSource(private val commonRepository: CommonRepository, pageSize:Int) : KoPagingSource<News>(pageSize) {
override suspend fun getData(page:Int, loadSize:Int):List<News>{
val result = commonRepository.newsList(page,loadSize)
//delay(2000)
if(result.success){
return result.data!!.list
}
return ArrayList()
}
}
注意这里的范型类型的传参。
本站内容来源于作者发布和网络转载,如有版权相关问题请及时与我们取得联系,我们将立即删除。