Pagging3写起来太麻烦,简单封装及其简单

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()
    }

}

注意这里的范型类型的传参。



本站内容来源于作者发布和网络转载,如有版权相关问题请及时与我们取得联系,我们将立即删除。

 关于作者
 热门教程
通过Git下载和提交代码的命令记录
安装好git后: 1、配置邮箱 git config --global user.name ymbok git con
2023-08-15
剑道仙尊
59
通过ADB在Android系统中快捷截屏和录屏的方法
连上ADB线后: 截图 创建一个BAT文件,用于截图,直接双击运行即可将图片保存到D:\screenshot目录,提前
2023-08-15
剑道仙尊
108
Android12 源码下载与编译
下载Android12 源码 sudo apt-get update 安装curl sudo apt install
2023-04-25
剑道仙尊
125
android生成签名文件jks并获取SHA1
打开Android Studio终端,输入: keytool -genkey -alias app -keyalg R
2022-07-13
剑道仙尊
93
Flutter开发APP更改状态栏文字颜色
void main(){ runApp(MyApp()); /// 状态栏文字黑色 SystemChrome
2022-06-09
剑道仙尊
132
Android Swicth按钮样式自定义
&lt;Switch android:id="@+id/switch_btn" android:layout_wi
2022-06-07
剑道仙尊
133
Pagging3写起来太麻烦,简单封装及其简单
Pagging3分页写起来很麻烦,这里分享一下我的简化开发的方法,思路就是把获取数据的函数分离出来 首先定义一个基础的
2022-06-07
剑道仙尊
199
在项目中使用Hilt Retrofit使用总结
直接开始,首先我们看看怎么使用Hilt编写 Retrofit 接口请求类 用@Provides注解定义可注入的实例的提
2022-06-07
剑道仙尊
199
Android Jetpack Paging 3 下拉刷新和加载更多代码示例
使用Paging3实现列表的下拉刷新和加载更多 首先定义列表布局文件 &lt;androidx.swiperefres
2022-06-07
剑道仙尊
434
StatefulBuilder实现Dialog的刷新
在Flutter中使用Dialog时,因为 showDialog返回的context与当前页面的 context不是同
2022-06-07
剑道仙尊
136