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

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())
    }
}
相关推荐
程序猿追2 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
jack186895 小时前
安卓手机忘记锁屏密码怎么办? 无需密码也可解锁
android·智能手机
应用市场8 小时前
不用一张图片的像素小游戏:小人是字符串,房间是矩形,平衡靠两千个假玩家
android·kotlin·游戏开发
stevenzqzq9 小时前
android 对渠道的理解
android
QEasycloud9 小时前
BOM接口抛转失败钉钉通知策略实战教程:MySQL异常日志到钉钉消息的端到端配置
android·mysql·钉钉
AIsoft_86899 小时前
医患交流内容如何做好记录?
android·iphone
蒸鱼Yuzheng10 小时前
Android Native 崩溃证据链:Tombstone、Build ID 与 Trace 如何联合归因
android·ndk·tombstone·调试符号·崩溃分析
事圆则缓10 小时前
Kotlin 变量与函数:把页面状态和行为写成清楚的契约
android·开发语言·kotlin
hunterandroid10 小时前
MVVM 迁移到 MVI:复杂页面状态如何收敛
android
妖星10 小时前
Android 开机动画定制:从 bootanimation.zip 到源码编译
android