ComposeUI——下拉刷新+上拉加载(一、简单封装)

article/2025/10/12 18:56:10

前言:ComposeUI是将来开发的趋势,本人也在对它进行学习,会把踩过的坑一一记录下来,希望能对大家有帮助。话不多说,直接开干。

目录

下拉刷新

1、引入依赖库

2、使用方法

上拉加载 

1、先看用法(结合下拉刷新):

2、具体实现


下拉刷新

下拉刷新有封装好的控件SwipeRefresh我们直接拿来用:

1、引入依赖库

repositories {mavenCentral()
}dependencies {implementation "com.google.accompanist:accompanist-swiperefresh:<version>"
}

注意:要根据自己项目中composeUI 的版本引入正确的版本号

2、使用方法

ViewModel:var isRefreshing by mutableStateOf(false)//用来控制SwipeRefresh的刷新状态private setUI:
SwipeRefresh(state = rememberSwipeRefreshState(isRefreshing = vm.isRefreshing),//用来控制SwipeRefresh的刷新状态onRefresh = {//刷新回调vm.loadTopArticle()vm.loadArticle(true)}) {LazyColum() {item {SwiperContent(dataSource = vm.swiperData)}items(vm.articleTopDataSource) { temp ->ArticleItem(item = temp, true)}}}

这个控件使用起来还是比较简单的,可以参考官网:Guide - Accompanist


上拉加载 

上拉加载我没有找到成熟的三方库,不过通过看网上各种大神的帖子,自己整理了一套,使用逻辑和下拉刷新基本一致。具体如下

1、先看用法(结合下拉刷新):

viewModel:var loadMoreState by mutableStateOf(LoadMoreState.hasMore)   //用来对loadmore状态控制private setUI:SwipeRefresh(state = rememberSwipeRefreshState(isRefreshing = vm.isRefreshing),//用来控制SwipeRefresh的刷新状态onRefresh = {//*刷新回调vm.loadTopArticle()vm.loadArticle(true)}) {LazyLoadMoreColum(loadMoreCallBack = {//*在加载更多的回调中去进行数据加载vm.loadArticle(false)}, loadMoreState = vm.loadMoreState //*用来控制上拉加载状态) {//以下内容跟LazyColum用法一样item {SwiperContent(dataSource = vm.swiperData)}items(vm.articleTopDataSource) { temp ->ArticleItem(item = temp, true)}items(vm.articleDataSource) { temp ->ArticleItem(item = temp, false)}}}

怎么样样式还算简洁吧。

2、具体实现

1、要实现加载更多肯定要判断LazyColum是否滚动到底部。LazyColum参数中有个LazyListState的实体,LazyListState的类中有一个layoutInfo参数,通过参数说明可以发现,通过它可以达到我们的目的。

    /*** The object of [LazyListLayoutInfo] calculated during the last layout pass. For example,* you can use it to calculate what items are currently visible.*/val layoutInfo: LazyListLayoutInfo get() = layoutInfoState.value

对LazyListState进行扩展,代码如下(具体看注释):LazyListStateExt.kt

import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.*/*** 扩展LazyColum的LazyListState,通过计算判断是否到达最后一项* @receiver LazyListState* @param buffer Int 指定离底部还剩几个时进行加载更多回调* @param loadMore Function0<Unit>*/
@Composable
fun LazyListState.OnBottomReached(buffer: Int = 0, loadMore: () -> Unit) {require(buffer >= 0) {"buffer 值必须是正整数"}//是否应该加载更多的状态val shouldLoadMore = remember {//因为状态由layoutInfo计算得到derivedStateOf {//列表为空的话直接返回trueval lastVisibleItem =layoutInfo.visibleItemsInfo.lastOrNull() ?: return@derivedStateOf true//如果现实项为最后一个item 返回truelastVisibleItem.index == layoutInfo.totalItemsCount - 1 - buffer}}LaunchedEffect(key1 = shouldLoadMore, block = {snapshotFlow {shouldLoadMore.value}.collect {if (it) {loadMore()}}})
}

2、对loadMore状态进行分析:

    LoadMore有三种状态:可加载更多、已加载全部、加载更多出错。

enum class LoadMoreState {hasMore,    //可加载更多内容noMore,     //已加载完全部内容loadError   //加载出错
}

3、封装LazyColum,对其根据加载状态追加加载状态提示。具体代码如下:LazyLoadMoreColum.kt


import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.lifeidroid.wanandroid.ext.OnBottomReached/*** 为LazyColum增加加载更多提示* @param modifier Modifier* @param loadMoreState LoadMoreState* @param loadMore Function0<Unit>* @param content [@kotlin.ExtensionFunctionType] Function1<LazyListScope, Unit>*/
@Composable
fun LazyLoadMoreColum(modifier: Modifier = Modifier,loadMoreState: LoadMoreState = LoadMoreState.hasMore,loadMoreCallBack: () -> Unit,content: LazyListScope.() -> Unit
) {val lazyListState = rememberLazyListState()lazyListState.OnBottomReached {if (loadMoreState == LoadMoreState.hasMore) {loadMoreCallBack()}}LazyColumn(modifier, state = lazyListState) {content()//LoadMore的提示内容,可以根据自己的需求去自定义该部分显示样式item {Box(modifier = Modifier.clickable {if (loadMoreState == LoadMoreState.loadError) {loadMoreCallBack()}}.fillMaxWidth().padding(vertical = 8.dp),contentAlignment = Alignment.Center,) {Text(text = when (loadMoreState) {LoadMoreState.hasMore -> "正在加载.."LoadMoreState.noMore -> "没有更多数据了.."LoadMoreState.loadError -> "网络出错,点击重试!"},fontSize = 14.sp,color = Color.Gray)}}}
}

代码很简单,大家可以根据源码进行阅读理解,我就啰嗦了。希望对大家有帮助。


http://chatgpt.dhexx.cn/article/aY03A0hR.shtml

相关文章

Flutter 下拉刷新、上拉加载

Flutter 下拉刷新、上拉加载有很多第三方插件&#xff0c;本文使用插件为&#xff1a;pull_to_refresh 目前pull_to_refresh在pub.dev上的使用情况&#xff1a; 刷新header的类型: ClassicHeader const ClassicHeader({Key? key,RefreshStyle refreshStyle: RefreshStyle.…

BaseQuickAdapter上拉加载功能实现

最近使用BaseQuickAdapter进行RecyclerView 的Adapter的数据绑定显示。 实现上拉加载与下拉刷新功能&#xff0c;遇到如下问题&#xff1a; 1、首先是实现下拉刷新、下拉加载的监听&#xff08;xml布局就不贴出来了&#xff09;&#xff1a; 2、现在贴出来错误的处理方式&…

android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多

纵观多数App&#xff0c;下拉刷新和上拉加载更多是很常见的功能&#xff0c;但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新&#xff0c;上拉加载更多还要自己做。 基于RecyclerView简单封装了这两个操作&#xff0c;下拉刷新支持LinearLayoutManager、GridLayoutManager…

uniapp下拉刷新上拉加载

一、需求 留言板主页&#xff0c;显示所有的留言信息&#xff0c;带有分页功能&#xff1b;上拉加载数据&#xff0c;下拉刷新数据二、代码 1、pages.json 2、messageBoard.vue 用了 uniapp 提供的组件&#xff1a; uni-load-more.vue <uni-load-more :status"load…

jquery 实现上拉加载功能

emmmm&#xff0c;看到了以前自己的写的代码&#xff0c;用jquery实现的上拉加载&#xff0c;顺便修复了以前漏下的bug&#xff0c;感觉可以记录一波。 好的先上图&#xff0c; 好的首先关注console控制台&#xff0c;再来就是右图的内容&#xff0c;页面上初始仅有两个div 接…

微信小程序下拉刷新、上拉加载

微信小程序官方没有给出具体的下拉刷新和上拉加载组件&#xff0c;我们可以基于小程序原生组件scroll-view的扩展与封装,实现简单的上拉加载、下拉刷新组件。 1. 封装组件 // components/customPullDown/index.js Component({options: {multipleSlots: true},properties: {ch…

uniapp局部上拉加载数据

一、页面局部实现上拉加载数据 只有评论区可以上拉加载数据&#xff0c;网上找到了 vue-infinite-scroll二、使用 官方示例 1、 npm 加载依赖 npm install vue-infinite-scroll --save2、 单个页面引用 import infiniteScroll from vue-infinite-scrollexport default {dire…

【Compose】亲手封装一个简单灵活的下拉刷新上拉加载 Compose Layout

Compose 的下拉刷新有现成的 Material 库可以直接使用&#xff0c;非常简单方便。 但是上拉加载目前没看到有封装的特别好的库&#xff0c;Paging 有些场景无法满足&#xff0c;而且上拉加载也是个比较简单的功能&#xff0c;没必要再去依赖一个质量未知的库。我们可以基于目前…

如何实现上拉加载,下拉刷新?

如何实现上拉加载下拉刷新&#xff1f; 实现原理上拉加载下拉刷新 实现原理 上拉加载及下拉刷新都依赖于用户交互 最重要的是要理解在什么场景&#xff0c;什么时机下触发交互动作 上拉加载 首先可以看一张图 上拉加载的本质是页面触底&#xff0c;或者快要触底时的动作 判…

【前端知识之JS】如何实现上拉加载和下拉刷新

前言 本系列主要整理前端面试中需要掌握的知识点。本节介绍如何实现上拉加载和下拉刷新。 文章目录 前言一、介绍二、实现原理1、上拉加载2、下拉刷新 一、介绍 下拉刷新和上拉加载这两种交互方式通常出现在移动端中&#xff1b;本质上等同于PC网页中的分页&#xff0c;只是交…

大数据和人工智能到底是什么关系

大数据和人工智能的关系&#xff0c;首先要说什么是大数据。这些年来&#xff0c;大数据先是被神化&#xff0c;继而又被妖魔化&#xff0c;到了今天&#xff0c;其实谁也不知道别人所谓的大数据指的是什么。有时候大数据的定义里既有平台&#xff08;硬件&#xff09;又有分析…

大数据和人工智能AI的联系和区别

大数据和人工智能两个词是我们现在频繁听到的两个词汇&#xff0c;那么这两者之间到底有什么联系 首先我们要了解到什么是大数据&#xff1f;什么是人工智能&#xff1f;大数据就是一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合&…

人工智能、机器学习、深度学习 三者关系

目录 1、AI ML DL关系 2、发展历程 2.1、人工智能&#xff08;ArtificiaI Intelligence&#xff09; 2.2、机器学习&#xff08;Machine Learning&#xff09; 2.3、深度学习&#xff08;Deep Learning&#xff09; 1、AI ML DL关系 为了赋予计算机以人类的理解能力与逻辑…

云计算、大数据和人工智能三者到底什么关系

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢&#xff1f;因为这三个东西现在非常火&#xff0c;并且它们之间好像互相有关系&#xff1a;一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

人工智能和大数据分析之间,主要有什么区别

首先来看看认知计算和人工智能的区别 人工智能的概念已经有二十多年&#xff0c;人工智能从历史和研究角度来讲主要目的是为了让机器表现的更像人类&#xff0c;我们称之为Intelligent Behavior。IBM的认知计算从技术角度上讲和AI是有很多共性的地方&#xff0c;比如机器学习&…

人工智能与大数据的完美结合

人工智能(AI)已经存在几十年了。然而&#xff0c;最近随着“大数据”的出现&#xff0c;它得到了越来越多的关注。维基百科对人工智能的释义如下: 在计算机科学中&#xff0c;人工智能研究的领域将自己定义为“智能代理AI和大数据&#xff1a;完美结合”的研究&#xff1a;任何…

大数据和人工智能的概念

大数据和人工智能的概念 概述大数据和人工智能领域的一些热门趋势。我们将看到世界如何通过数字化而改变&#xff0c;从而导致消费和工业领域的大数据现象&#xff1b;了解到数据量呈指数级增长&#xff0c;从太字节到艾字节再到泽字节&#xff1b;意识到计算机的处理能力增加…

云计算、大数据和人工智能之间的关系

大家好&#xff0c;这里是抖码课堂&#xff0c;抖码课堂专注提升互联网技术人的软硬实力。 这篇文章我们从下面的内容来聊下云计算、人工智能、大数据技术三者之间的关系 探讨什么是云计算&#xff0c;在这里分别探讨云计算的 IaaS、PaaS 以及 SaaS 探讨云计算和大数据技术之…

大数据属于人工智能吗?什么是大数据?

对于“大数据”(Big data)研究机构Gartner给出了这样的定义。“大数据”是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力来适应海量、高增长率和多样化的信息资产。大数据属于人工智能吗&#xff1f;本篇来解答一下这个问题。 大数据属于人工智能吗&#xff…

大数据和人工智能之间,主要有什么区别?

大数据vs.人工智能是一种公平的比较吗?在某种程度上&#xff0c;它是&#xff0c;但首先让我们先厘清它们之间的区别。 人工智能和大数据是人们耳熟能详的流行术语&#xff0c;但也可能会有一些混淆。人工智能和大数据有什么相似之处和不同之处?它们有什么共同点吗?它们是否…