Compose中使用paging3进行列表分页加载Room中的数据

这篇具有很好参考价值的文章主要介绍了Compose中使用paging3进行列表分页加载Room中的数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

本文简要记录下流程,代码需要修改后才可以运行。
另外使用paging进行数据加载可以做到数据变动感知,只要数据库数据变动,页面就会自动刷新,无需额外操作

二、相关依赖

<project>/build.gradle

buildscript {
    ext {
        compose_version = '1.5.4'
    }
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '8.2.1' apply false
    id 'com.android.library' version '8.2.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.9.22' apply false
}

app/build.gradle

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    compileSdk 34

    defaultConfig {
        applicationId "com.design.compose"
        minSdk 21
        targetSdk 34
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_18
        targetCompatibility JavaVersion.VERSION_18
    }
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_18
    }
    buildFeatures {
        compose true
    }
    composeOptions {
        kotlinCompilerExtensionVersion "1.5.8"
        kotlinCompilerVersion "1.9.22"
    }
    packagingOptions {
        resources {
            excludes += '/META-INF/{AL2.0,LGPL2.1}'
        }
    }

    namespace 'com.design.compose'
}

dependencies {

    implementation 'androidx.core:core-ktx:1.12.0'
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "androidx.compose.material:material:$compose_version"
    implementation "androidx.compose.material3:material3"
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
    implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2")

    implementation("androidx.activity:activity-compose:1.8.1")
    implementation(platform("androidx.compose:compose-bom:2023.03.00"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.ui:ui-graphics")
    implementation("androidx.compose.ui:ui-tooling-preview")

    implementation "androidx.paging:paging-compose:3.2.1"
//    该依赖需要target为34,可以使用androidx.paging:paging-compose进行替代
//    implementation "androidx.paging:paging-compose-android:3.3.0-alpha02"
    implementation "androidx.paging:paging-runtime-ktx:3.2.1"
    implementation "androidx.paging:paging-common-ktx:3.2.1"
    implementation "androidx.room:room-paging:2.6.1"
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2'
    implementation 'androidx.activity:activity-compose:1.8.1'
    kapt("androidx.room:room-compiler:2.6.1")
    implementation("androidx.room:room-runtime:2.6.1")
    implementation("androidx.room:room-ktx:2.6.1")
    implementation("androidx.room:room-paging:2.4.2")
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
    debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
    debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
}

二、具体代码

@Parcelize
@Entity(tableName = "user_table")
data class UserInfo(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var id: Long = 0L,

    @ColumnInfo(name = "name")
    var name: String = "",
): Parcelable

@Dao
interface UserDao {
    @Query("SELECT * FROM user_table")
    fun getAllPagingSource(): PagingSource<Int, UserInfo>
    
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(list: List<UserInfo>)
    
    @Delete
    fun deleteAll(list: List<UserInfo>)
}
@Database(entities = [UserInfo::class,], version = 1, exportSchema = true)
abstract class DatabaseManager : RoomDatabase() {
    abstract fun getUserDao(): User

    companion object {
        private const val DATABASE_NAME = "user.db"

        private val instance by lazy {
            Room.databaseBuilder(App.getInstance(), DatabaseManager::class.java, DATABASE_NAME).build()
        }

        private fun getUserDao(): AlertDao {
            return instance.getUserDao()
        }
         fun getUserAllPagingSource(): PagingSource<Int,UserInfo>{
            return getAlertAreaDao().getAllPagingSource()
        }
    }
}

ViewModel

class UserModel : ViewModel(){
    val action = MutableLiveData<Action>()
    val singlePageSize = 10 //每页显示为10条

    fun loadRoomData(): PagingSource<Int, UserInfo> {
        return DatabaseManager.getUserAllPagingSource()
    }

    fun sendAction(action: Action) {
        this.action.value = action
    }

    sealed class Action {
        object BACK : Action()
        object ADD : Action()
        data class DETAILS(val info: UserInfo) : Action()
    }
}

UI文章来源地址https://www.toymoban.com/news/detail-816408.html

...
@Composable
    fun Center(modifier: Modifier = Modifier, viewModel: UserModel = viewModel()) {
        val pager = remember {
            Pager(
                PagingConfig(
                    pageSize = viewModel.singlePageSize,
                    enablePlaceholders = true,
//                    maxSize = 200
                )
            ) { viewModel.loadRoomData() }
        }

        val lazyPagingItems = pager.flow.map {
            it.map { info ->
              //  info.name = "${info.name}-->后缀"
                info.copy(name = "${info.name}-->后缀")
//                Log.e("YM--->", "--->区域时间:${info.areaCreateTime}")
            }
        }.collectAsLazyPagingItems()

        LazyColumn(modifier = modifier) {
            if (lazyPagingItems.itemCount == 0) {
                item(key = "defaultItem", contentType = "defaultItem") {
                    DefaultUserItem()
                }
            }

            items(count = lazyPagingItems.itemCount) { index ->
                val item = lazyPagingItems[index]
                if (item != null) {
                    UserItem(
                        modifier = Modifier.clickable(// 去除点击效果
                            indication = null,
                            interactionSource = remember {
                                MutableInteractionSource()
                            }) {
                            viewModel.sendAction(UserModel.Action.DETAILS(item))
                        },
                        info = item
                    )
                }
            }

            if (lazyPagingItems.loadState.append == LoadState.Loading) {
                item(key = "loadItem", contentType = "loadItem") {
                    CircularProgressIndicator(
                        modifier = Modifier
                            .fillMaxWidth()
                            .wrapContentWidth(Alignment.CenterHorizontally)
                    )
                }
            }

        }
    }

...

三、参考链接

  1. androidx.paging.compose
  2. Paging 库概览

到了这里,关于Compose中使用paging3进行列表分页加载Room中的数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue.js 中使用 Element UI 实现异步加载分页列表

    在前端开发中,我们常常需要展示大量数据,并提供分页浏览的功能。本篇博客将介绍如何使用 Vue.js 和 Element UI 组件库创建一个简单的异步加载分页列表。 Vue.js Element UI JavaScript 我们将创建一个包含表格和分页组件的 Vue 单文件组件。以下是组件的基本结构: 引入 Element U

    2024年02月04日
    浏览(55)
  • 7.7 SpringBoot实战 管理员借阅审核列表 --分页和枚举的使用

    本文主要实战 管理员借阅审核分页列表,更多的是复习之前讲过的技术点,像 API接口的定义、分页pageHelper的使用、角色权限的校验 等等,另外针对【图书借阅审核状态】引入了 枚举 的使用。 按照规划,本专栏剩余的文章还会有很多新技术点,当然像本文这样的复习也少不

    2024年02月14日
    浏览(35)
  • Mybatis-Plus学习4 Page分页

    ctrl + P = 查看可填的属性类型  alt + 回车 = 自动填充数据类型 1、使用Page分页需要先配置config类,加上拦截器 type-aliasys-package配置pojo对象别名对应的包 自定义的Mapper的page查询: 乐观锁 和 悲观锁 悲观锁: 悲观锁的思想是,在操作数据之前,先假设其他并发操作会对数据进行

    2024年02月12日
    浏览(44)
  • wordpress框架自定义添加page分页功能

    先来看效果图: 一、在主题目录下的functions.php文件里,添加如下分页函数:  我这个函数是按网站需求做了一些调整和修改,因为我首页只显示三个分类,直接用$wp_query-max_num_pages查总页码的话是不准的,所以你要根据自己的网站数据来调整这个函数的代码。 二、在公共的

    2024年02月16日
    浏览(38)
  • MyBatis-Plus Page 分页不生效

    一、问题现象 使用 MyBatis-Plus 进行分页查询时,传入了 pageNum 和 pageSize,但是查询结果没有按照预期的效果返回。 二、问题原因 没有对 Mybatis-Puls 进行初始化,需要添加相应的配置类。 三、解决方案 在项目工程中创建 config 目录,在其中新建配置类 MyBatisPlusConfig.java 。 注意

    2024年02月12日
    浏览(42)
  • Compose布局之Image控件使用详解:加载网络图片与内容缩放

    本文详细介绍了Compose框架中Image控件的基础使用,包括加载网络图片、contentScale内容缩放等高级功能,帮助开发者更好地掌握Compose布局中的图片展示技巧。

    2024年02月11日
    浏览(103)
  • Mybatis Plus中使用LambdaQueryWrapper进行分页以及模糊查询对比传统XML方式进行分页

    传统的XML方式只能使用limit以及offset进行分页,通过判断name和bindState是否为空,不为空则拼接条件。 只需要在Service实现类中直接调用Mybatis Plus的方法即可进行操作。 return PageSanitationCompanyStaff类型可以得到数据的总数,你也可以通过.getRecords()方式获取List集合 这样子,我们就

    2024年02月12日
    浏览(58)
  • 【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

      💭 写在前面 本系列博客为复习操作系统导论的笔记,内容主要参考自: Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy PiecesA. Silberschatz, P. Galvin, and G. Gagne, Operating System Concepts, 9th Edition, John Wiley Sons, Inc., 2014, ISBN 978-1-118-09375-7.Microsoft. MSDN(Microsoft Developer

    2024年02月04日
    浏览(48)
  • 微信小程序 下拉分页 z-paging下拉刷新、上拉加载

    【z-paging下拉刷新、上拉加载】高性能,全平台兼容。支持虚拟列表,支持nvue、vue3 - DCloud 插件市场  z-paging,使用非常简单,按部就班就行了 1,首先将其导入自己的小程序项目中  导入后的效果 2,具体如何使用:https://z-paging.zxlee.cn    选项式api写法(vue2/vue3) 组合式api写法

    2024年02月11日
    浏览(55)
  • element 分页切换时:current-page无效 页数不会跟着一起切换

    问题回溯:使用el-pagination组件 选择切换当前分页 页数为2 问题结果:el-pagination组件 当前页切换失败 一直都是 1,接口传参分页数据是2,打印当前分页也是2 解决方案1:使用 current-page参数 .sync 修饰符 解决方案2:检查获取表格方法的时候 取消手动设置 total = 0 例子:

    2024年04月27日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包