Android compose下拉刷新控件

效果图:

使用代码:

PullRefreshLazyColumn(count = list.size, onRefresh = {
        // 执行刷新操作,比如去http查询数据。
    }) { index ->
        val item = list.value[index]
        Text(text = "item:$item")
    }

封装代码:

@Composable
fun PullRefreshLazyColumn(
    modifier: Modifier = Modifier,
    isRefreshing: MutableState<Boolean> = remember { mutableStateOf(false) },
    headHeight: Dp = 50.dp,
    head: @Composable BoxScope.(Float, Modifier) -> Unit = { progress, m ->
        RefreshDefaultHead(
            progress,
            m
        )
    },
    headProgress: @Composable BoxScope.() -> Unit = { RefreshDefaultProgress() },
    count: Int,
    onRefresh: suspend () -> Unit,
    item: @Composable LazyItemScope.(Int) -> Unit
) {
    val scope = rememberCoroutineScope()

    val pullRefreshState = rememberPullRefreshState(refreshing = isRefreshing.value, onRefresh = {
        scope.launch {
            isRefreshing.value = true
            onRefresh()
            isRefreshing.value = false
        }
    })

    Column(
        modifier = Modifier
            .then(modifier)
            .pullRefresh(pullRefreshState)
    ) {
        if (isRefreshing.value) {
            Box(modifier = Modifier
                .align(Alignment.CenterHorizontally)
                .height(headHeight.value.dp)) {
                headProgress()
            }
        } else {
            var height = pullRefreshState.progress * headHeight.value
            if (height > headHeight.value) {
                height = headHeight.value
            }
            Box(
                modifier = Modifier
                    .height(height.dp)
                    .align(Alignment.CenterHorizontally)) {
                head(pullRefreshState.progress, Modifier.height(height.dp))
            }
        }
        LazyColumn {
            items(count = count) { index ->
                item(index)
            }
        }
    }
}

@Composable
private fun BoxScope.RefreshDefaultHead(progress: Float, modifier: Modifier) {
    Row(
        modifier = Modifier
            .then(modifier)
            .align(Alignment.Center)
    ) {
        var text = "下拉刷新"
        val rotate = if (progress > 1) {
            text = "松开刷新"
            1f
        } else {
            progress
        } * 180 - 90
        Image(
            imageVector = Icons.Default.ArrowBack,
            contentDescription = "",
            contentScale = ContentScale.Crop,
            modifier = Modifier
                .rotate(rotate)
                .size(25.dp)
                .align(Alignment.CenterVertically)
        )
        Text(
            text = text, modifier = Modifier
                .align(Alignment.CenterVertically)
        )
    }
}

// 下拉刷新正在刷新的UI
@Composable
private fun BoxScope.RefreshDefaultProgress() {
    CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值