内容纲要
- 在项目的 build.gradle 文件中添加以下依赖:
// Jetpack Compose
implementation "androidx.compose.ui:ui:1.0.0"
implementation "androidx.compose.material:material:1.0.0"
implementation "androidx.compose.runtime:runtime-livedata:1.0.0"
// Room
implementation "androidx.room:room-runtime:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"
// Paging 3
implementation "androidx.paging:paging-compose:1.0.0"
- 创建 Room 数据库和数据访问对象(Dao)。在 Dao 中编写查询语句,例如:
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getUsers(): PagingSource<Int, User>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUsers(users: List<User>)
}
- 在应用程序的入口处初始化 Room 数据库:
val database = Room.databaseBuilder(context, AppDatabase::class.java, "database-name").build()
- 创建数据源(PagingSource):
class UserPagingSource(private val userDao: UserDao) : PagingSource<Int, User>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, User> {
val page = params.key ?: 1
val pageSize = params.loadSize
val offset = (page - 1) * pageSize
val users = userDao.getUsers(offset, pageSize)
val prevKey = if (page == 1) null else page - 1
val nextKey = if (users.isEmpty()) null else page + 1
return LoadResult.Page(users, prevKey, nextKey)
}
}
- 创建分页数据流(Flow):
fun getUsers(): Flow<PagingData<User>> {
val userDao = database.userDao()
val pagingSourceFactory = { userDao.getUsers() }
val config = PagingConfig(pageSize = 20)
return Pager(config, pagingSourceFactory).flow
}
- 在 Jetpack Compose 中使用分页数据流:
val userList = viewModel.getUsers().collectAsLazyPagingItems()
LazyColumn {
items(userList) { user ->
Text(user.name)
}
userList.apply {
when {
loadState.refresh is LoadState.Loading -> {
item {
CircularProgressIndicator()
}
}
loadState.append is LoadState.Loading -> {
item {
LoadStateFooter()
}
}
loadState.refresh is LoadState.Error -> {
// Handle error
}
loadState.append is LoadState.Error -> {
// Handle error
}
}
}
}
这是一个简单的示例,你可以根据自己的需求进行修改和拓展。