android compose PullToRefreshAndLoadMore 下拉刷新 + 上拉加载更多 使用

/**
* Author : wn
* Email : maoning20080809@163.com
* Date : 2026/1/6 20:23
* Description : 下拉刷新 + 上拉加载更多
*/
class PullToRefreshActivity : ComponentActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
testPullToRefreshAndLoadMoreDemo()
}
}
@Preview
@Composable
private fun testPullToRefreshAndLoadMoreDemo(){
var refreshing by remember { mutableStateOf(false) }
var loadingMore by remember { mutableStateOf(false) }
var items by remember { mutableStateOf<ArrayList<String>>(arrayListOf()) }
var page by remember { mutableStateOf(1) }
//初始化加载数据
LaunchedEffect(Unit) {
items = loadData(page)
}
//下拉刷新
LaunchedEffect(refreshing) {
if(refreshing){
delay(1500)
page = 1
items = loadData(page)
refreshing = false
}
}
//上拉加载更多
LaunchedEffect(loadingMore) {
if(loadingMore){
delay(1500)
page++
val newItemList = loadData(page)
items.addAll(newItemList)
loadingMore = false
}
}
Text(text = "PullToRefreshAndLoadMore 下拉刷新 下拉加载更多", color = Color.Red)
SwipeRefresh(state = rememberSwipeRefreshState(refreshing),
onRefresh = {
refreshing = true
}) {
LazyColumn() {
items(items.size){index ->
Text(text = items[index], modifier = Modifier.fillMaxWidth().padding(16.dp))
//检测是否滚动到底部
if(index == items.size -1 && !loadingMore && !refreshing){
loadingMore = true
}
}
//显示加载更多指示器
if(loadingMore){
item{
Box(modifier = Modifier.fillMaxWidth().padding(16.dp),
contentAlignment = Alignment.Center){
CircularProgressIndicator()
}
}
}
}
}
}
private suspend fun loadData(page : Int) : ArrayList<String>{
//模拟网络请求
//delay(500)
return List(20){"Item ${(page - 1) * 20 + it + 1}"}.toCollection(ArrayList())
}
}