Android Compose 十一:常用组件列表 compose自己个的 下拉刷新

列表下拉刷新

  • material3 还没有下拉刷新功能
  • material:1.3.0 之后 swiperefresh 被弃用 被PullRefresh替代
  • 使用PullRefresh 需要添加依赖 implementation 'androidx.compose.material:material:1.6.8'
先上代码
复制代码
var refreshing by remember {
        mutableStateOf(false)
    }    

    val list = remember{
        List(10){"条目》》${it}"}.toMutableStateList()
    }

    val scope = rememberCoroutineScope()
    val refreshState = rememberPullRefreshState(refreshing = refreshing, onRefresh = {
        scope.launch {
            refreshing = true
            list.addAll( List(20){
                delay(100)
                "新的条目》》${it}"
            })
            refreshing = false
        }
    })

    Box(modifier = Modifier
        .pullRefresh(refreshState)
        .padding(20.dp)){
        LazyColumn(modifier = Modifier.fillMaxSize()){
            items(list){
                Text(text = "条目>>${it}")
            }
        }

        PullRefreshIndicator(refreshing = refreshing, state = refreshState,modifier=Modifier.align(
            Alignment.TopCenter
        ))
    }
再看效果
  • 默认列表10条
  • 下拉刷新时 协程添加20条 每条延时100ms后刷新结束
接着分析
复制代码
fun Modifier.pullRefresh(
    state: PullRefreshState,     //刷新状态的回调
    enabled: Boolean = true
)

上边是让我们使用rememberPullRefreshState,那么我们就听话看看rememberPullRefreshState

复制代码
@Composable
@ExperimentalMaterialApi
fun rememberPullRefreshState(
    refreshing: Boolean,      //当前是否正在刷新
    onRefresh: () -> Unit,    //刷新时调用此函数
    refreshThreshold: Dp = PullRefreshDefaults.RefreshThreshold,
    refreshingOffset: Dp = PullRefreshDefaults.RefreshingOffset,
): PullRefreshState {
接着我们看看 PullRefreshIndicator
复制代码
fun PullRefreshIndicator(
    refreshing: Boolean,    //A boolean representing whether a refresh is occurring. 
    state: PullRefreshState,  //刷新时的回调函数
    modifier: Modifier = Modifier,
    backgroundColor: Color = MaterialTheme.colors.surface,
    contentColor: Color = contentColorFor(backgroundColor),
    scale: Boolean = false
) {

如果我们注释掉PullRefreshIndicator

结果

  • 没有了刷新的指示器
  • 依然可以刷新列表

说明:

  • PullRefreshIndicator只是用来显示当前是否正在刷新状态的指示器
  • 执行列表刷新的还是Modifer.pullRefresh
于是乎 开玩
复制代码
//        PullRefreshIndicator(refreshing = refreshing, state = refreshState,modifier=Modifier.align(
//            Alignment.TopCenter
//        ))

        AnimatedVisibility(visible = refreshing,modifier = Modifier.align(Alignment.TopCenter)){
            CircularProgressIndicator(
                modifier = Modifier.width(64.dp),
                color = MaterialTheme.colorScheme.secondary,
            )
        }`

结果

相关推荐
kymjs张涛24 分钟前
OpenClaw 学习小组:初识
android·linux·人工智能
范特西林4 小时前
实战演练——从零实现一个高性能 Binder 服务
android
范特西林5 小时前
代码的生成:AIDL 编译器与 Parcel 的序列化艺术
android
范特西林5 小时前
深入内核:Binder 驱动的内存管理与事务调度
android
范特西林5 小时前
解剖麻雀:Binder 通信的整体架构全景图
android
范特西林5 小时前
破冰之旅:为什么 Android 选择了 Binder?
android
奔跑中的蜗牛6667 小时前
一次播放器架构升级:Android 直播间 ANR 下降 60%
android
测试工坊9 小时前
Android 视频播放卡顿检测——帧率之外的第二战场
android
Kapaseker10 小时前
一杯美式深入理解 data class
android·kotlin
鹏多多10 小时前
Flutter使用screenshot进行截屏和截长图以及分享保存的全流程指南
android·前端·flutter