前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >获取数据并绑定到 UI | MAD Skills

获取数据并绑定到 UI | MAD Skills

作者头像
Android 开发者
发布于 2022-03-12 05:17:03
发布于 2022-03-12 05:17:03
87700
代码可运行
举报
文章被收录于专栏:Android 开发者Android 开发者
运行总次数:0
代码可运行

欢迎回到 MAD Skills 系列 课程之 Paging 3.0!在上一篇 Paging 3.0 简介 的文章中,我们讨论了 Paging 库,了解了如何将它融入到应用架构中,并将其整合进了应用的数据层。我们使用了 PagingSource 来为我们的应用获取并使用数据,以及用 PagingConfig 来创建能够提供 Flow<PagingData>UI 消费的 Pager 对象。在本文中我将介绍如何在您的 UI 中实际使用 Flow<PagingData>

为 UI 准备 PagingData

应用现有的 ViewModel 暴露了能够提供渲染 UI 所需信息的 UiState 数据类,它包含一个 searchResult 字段,用于将搜索结果缓存在内存中,可在配置变更后提供数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data class UiState(
    val query: String,
    val searchResult: RepoSearchResult
)

sealed class RepoSearchResult {
    data class Success(val data: List<Repo>) : RepoSearchResult()
    data class Error(val error: Exception) : RepoSearchResult()
}

△ 初始 UiState 定义

现在接入 Paging 3.0,我们移除了 UiState 中的 searchResult,并选择在 UiState 之外单独暴露出一个 PagingData<Repo>Flow 来代替它。这个新的 Flow 功能与 searchResult 相同: 提供一个让 UI 渲染的项目列表。

ViewModel 中添加了一个私有的 "searchRepo()" 方法,它调用 Repository 来提供 Pager 中的 PagingData Flow。我们可以调用该方法来创建基于用户输入搜索词的 Flow<PagingData<Repo>>。我们还在生成的 PagingData Flow 上使用了 cachedIn 操作符,使其能够通过 ViewModelScope 快速复用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SearchRepositoriesViewModel(
    private val repository: GithubRepository,) : ViewModel() {private fun searchRepo(queryString: String): Flow<PagingData<Repo>> =
        repository.getSearchResultStream(queryString)
}

△ 为仓库集成 PagingData Flow

暴露一个独立于其它 Flow 的 PagingData Flow 这一点非常重要 。因为 PagingData 自身是一个可变类型,它内部维护了自己的数据流并且会随着时间的变化而更新。

随着组成 UiState 字段的 Flow 全部被定义,我们可以将其组合成 UiStateStateFlow,并和 PagingDataFlow 一起暴露出来给 UI 消费。完成这些之后,现在我们可以开始在 UI 中消费我们的 Flow 了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SearchRepositoriesViewModel() : ViewModel() {

    val state: StateFlow<UiState>

    val pagingDataFlow: Flow<PagingData<Repo>>

    init {
        …

        pagingDataFlow = searches
            .flatMapLatest { searchRepo(queryString = it.query) }
            .cachedIn(viewModelScope)

        state = combine(...)
    }

}

△ 暴露 PagingData Flow 给 UI 注意 cachedIn 运算符的使用

在 UI 中消费 PagingData

首先我们要做的就是将 RecyclerView Adapter 从 ListAdapter 切换到 PagingDataAdapterPagingDataAdapter 是为比较 PagingData 的差异并聚合更新而优化的 RecyclerView Adapter,用以确保后台数据集的变化能够尽可能高效地传递。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 之前
// class ReposAdapter : ListAdapter<Repo, RepoViewHolder>(REPO_COMPARATOR) {
//     …
// }

// 之后
class ReposAdapter : PagingDataAdapter<Repo, RepoViewHolder>(REPO_COMPARATOR) {}
view raw

△ 从 ListAdapter 切换到 PagingDataAdapter

接下来,我们开始从 PagingData Flow 中收集数据,我们可以这样使用 submitData 挂起函数将它的发射绑定到 PagingDataAdapter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private fun ActivitySearchRepositoriesBinding.bindList(
        pagingData: Flow<PagingData<Repo>>,
    ) {
        …
        lifecycleScope.launch {
            pagingData.collectLatest(repoAdapter::submitData)
        }

    }

△ 使用 PagingDataAdapter 消费 PagingData 注意 colletLatest 的使用

此外,为了用户体验着想,我们希望确保当用户搜索新内容时,将回到 列表的顶部 以展示第一条搜索结果。我们期望在 我们加载完成并已将数据展示到 UI 时做到这一点。我们通过利用 PagingDataAdapter 暴露的 loadStateFlowUiState 中的 "hasNotScrolledForCurrentSearch" 字段来跟踪用户是否手动滚动列表。结合这两者可以创建一个标记让我们知道是否应该触发自动滚动。

由于 loadStateFlow 提供的加载状态与 UI 显示的内容同步,我们可以有把握地在每次 loadStateFlow 通知我们新的查询处于 NotLoading 状态时滚动到列表顶部。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private fun ActivitySearchRepositoriesBinding.bindList(
        repoAdapter: ReposAdapter,
        uiState: StateFlow<UiState>,
        pagingData: Flow<PagingData<Repo>>,
    ) {
        …
        val notLoading = repoAdapter.loadStateFlow
            // 仅当 PagingSource 的 refresh (LoadState 类型) 发生改变时发射
            .distinctUntilChangedBy { it.source.refresh }
            // 仅响应 refresh 完成,也就是 NotLoading。
            .map { it.source.refresh is LoadState.NotLoading }

        val hasNotScrolledForCurrentSearch = uiState
            .map { it.hasNotScrolledForCurrentSearch }
            .distinctUntilChanged()

        val shouldScrollToTop = combine(
            notLoading,
            hasNotScrolledForCurrentSearch,
            Boolean::and
        )
            .distinctUntilChanged()

        lifecycleScope.launch {
            shouldScrollToTop.collect { shouldScroll ->
                if (shouldScroll) list.scrollToPosition(0)
            }
        }
    }

△ 实现有新查询时自动滚动到顶部

添加头部和尾部

Paging 库的另一个优点是在 LoadStateAdapter 的帮助下,能够在页面的顶部或底部显示进度指示器。RecyclerView.Adapter 的这一实现能够在 Pager 加载数据时自动对其进行通知,使其可以根据需要在列表顶部或底部插入项目。

而它的精髓是您甚至不需要改变现有的 PagingDataAdapterwithLoadStateHeaderAndFooter 扩展函数可以很方便地使用头部和尾部包裹您已有的 PagingDataAdapter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private fun ActivitySearchRepositoriesBinding.bindState(
        uiState: StateFlow<UiState>,
        pagingData: Flow<PagingData<Repo>>,
        uiActions: (UiAction) -> Unit
    ) {
        val repoAdapter = ReposAdapter()
        list.adapter = repoAdapter.withLoadStateHeaderAndFooter(
            header = ReposLoadStateAdapter { repoAdapter.retry() },
            footer = ReposLoadStateAdapter { repoAdapter.retry() }
        )
    }

△ 头部和尾部

withLoadStateHeaderAndFooter 函数的参数中为头部和尾部都定义了 LoadStateAdapter。这些 LoadStateAdapter 相应地托管了自身的 ViewHolder,这些 ViewHolder 与最新的加载状态绑定,因此很容易定义视图行为。我们还可以传入参数实现当出现错误时重试加载,我将会在下一篇文章中详细介绍。

后续

我们已经将 PagingData 绑定到了 UI 上!来快速回顾一下:

  • 使用 PagingDataAdapter 将我们的 Paging 集成到 UI 上
  • 使用 PagingDataAdapter 暴露的 LoadStateFlow 来保证仅当 Pager 结束加载时滚动到列表的顶部
  • 使用 withLoadStateHeaderAndFooter() 实现当获取数据时将加载栏添加到 UI 上

感谢您的阅读!敬请关注下一篇文章,我们将探讨用 Paging 实现以数据库作为单一来源,并详细讨论 LoadStateFlow

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【深度算法】APP直播想实现“逆天”美颜,你只需要一个人脸识别API
几年前图片美颜教育了市场,到了直播时代,美颜同样成为直播平台的标配。女主播要是在直播中不能自动美颜,那只能靠更精致的妆容来补,而实时直播美颜技术恰好解决了这个问题。 目前最新的美颜技术已经发展到了2.
BestSDK
2018/02/27
3.8K0
【深度算法】APP直播想实现“逆天”美颜,你只需要一个人脸识别API
美图AI绘画机器人上线,小姐姐们,新一轮头像可以换起了
李根 假装发自 Amoy 量子位 报道 | 公众号 QbitAI 你是不是也想要一张插画风格的头像?又要像你,又要插画风格、彩绘色系? OK,美图AI绘画机器人Andy上线了。 之前美图专门给Angelababy打造的“插画风格”AI绘画师,现在已升级迭代到最新版本美图秀秀App中。 只要上传一张自拍照,“Andy”就能画出不同风格的插画像,风格达10多种。 其实更早之前,美图还推出过“手绘自拍”的功能,不过相比“Andy”还是弱爆了。 二者区别在于,手绘自拍
量子位
2018/03/23
1.6K0
美图AI绘画机器人上线,小姐姐们,新一轮头像可以换起了
直播APP接入高品质美颜SDK效果的全方位指南
‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌​‌‌‌‍‌​​‌‌​‌​‍‌​‌‌​‌​‌‍‌​‌​‌‌​​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌​‌​‌​‌​‍‌‌​​‌‌‌‌‍‌​​‌​‌​‌‍‌‌​​‌‌‌​‍‌​‌​‌‌​​‍‌​‌‌‌​​​‍‌‌​​‌​​‌‍‌​‌‌​​‌​‍‌​​​‌​‌‌‍‌​​‌​​​‌‍‌​​‌‌‌​​在直播行业竞争日益激烈的今天,美颜功能已成为提升用户体验、增强用户粘性的关键要素。美颜SDK凭借其强大的技术架构和丰富的功能,为开发者提供了一个高效、灵活的解决方案。本文将从美颜SDK的选择、集成、优化到实际应用,全方位解析如何开发一个优秀的美颜直播APP,帮助开发者在实际项目中顺利实现高质量的美颜效果。
澜极美颜SDK
2025/02/19
2270
直播APP接入高品质美颜SDK效果的全方位指南
你今天怎么这么好看——基于深度学习的大型现场实时美颜
美颜是当下直播甚至是所有形式对外展示的一个必备条件。手机端的美颜就像私人化妆师,能够帮助我们实现各种心仪的效果。
LiveVideoStack
2020/03/31
1.5K0
你今天怎么这么好看——基于深度学习的大型现场实时美颜
澜极美颜SDK:打造极致美颜体验的技术秘籍与集成攻略
在当今这个“颜值即正义”的时代,美颜功能已成为各类社交、娱乐应用的标配。而澜极美颜SDK,凭借其卓越的技术实力和高效的集成方案,正成为开发者们打造完美美颜应用的首选利器。本文将深度剖析澜极美颜SDK的开发技术细节与优化策略,同时揭秘其模块化设计与高效集成的秘诀,助力开发者轻松实现自然、流畅的美颜效果,提升产品竞争力。
澜极美颜SDK
2025/01/15
1530
澜极美颜SDK:打造极致美颜体验的技术秘籍与集成攻略
直播平台开发中美颜、滤镜的技术要求
直播平台开发完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,比如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理。在主播和观众连麦场景中,主播需要和某个或者多个观众进行对话,并将对话结果实时分享给其他所有观众,连麦的处理也有部分工作在推流端完成。
布谷安妮
2019/09/24
1.3K0
直播平台开发中美颜、滤镜的技术要求
一站式打造直播美颜APP的高效集成与开发指南
在当今竞争激烈的直播市场中,一款能够快速部署且效果出众的美颜功能是吸引用户的关键。澜极美颜SDK凭借其强大的技术架构和丰富的功能,为开发者提供了一站式的美颜解决方案。本文将从技术架构、选型评估、集成步骤到优化实践,全方位解读如何利用澜极美颜SDK快速打造高质量的直播美颜APP,助力开发者在直播领域脱颖而出。
澜极美颜SDK
2025/01/22
1330
一站式打造直播美颜APP的高效集成与开发指南
2025年直播美颜与滤镜技术的未来趋势
在数字化时代,直播已成为连接人与世界的桥梁,而美颜功能则是这座桥梁上最璀璨的明珠。随着技术的飞速发展,2025年的直播美颜与滤镜技术将迎来前所未有的变革。澜极美颜SDK,作为行业的先行者,将如何以创新技术引领这一变革,为用户提供更加智能、个性化的美颜体验?本文将为您深度剖析澜极美颜SDK的技术演进与未来趋势,带您领略美颜技术的无限魅力。
澜极美颜SDK
2025/01/18
1540
2025年直播美颜与滤镜技术的未来趋势
手机原相机能加美颜特效SDK,实现实时美颜效果吗?
我们常吐槽手机(尤其是苹果)原相机丑,其实并不是原相机丑,是“耿直”,不对拍摄出的图片做出任何修饰,镜头怎么歪就怎么扭曲图像、不能自主实现左右翻转、没有磨皮效果且镜头高清,不给美白并对细节真实还原,照出你的全部缺点。如何解决该问题?给耿直的手机原相机加个美颜特效SDK,一切问题都能迎刃而解。
用户6533225
2019/10/31
2.6K0
AI进了直播间,这画风666
科技时代,我们更加怀念温暖邂逅的时光 这一次IBMWatson为大家带来了Spotify 全球榜 Top 2 的单曲,Watson 学习了 26000 首流行歌曲,帮助主唱Alex Da kid创作了这首《Not Easy》。 全文共2641字,预计阅读时长3分钟 这年头,直播已经不新鲜了,网红们陪聊卖笑,辣眼睛玩心跳,或者博眼球求关注,宛如一股洪流泛滥成灾。 9个机器人组成的首个机器人主播天团 相比之下,(当红炸子鸡TFboys的孪生兄弟)TLboys天团更像是一股网红界的“清流”——由9个机器人组成
企鹅号小编
2018/01/18
2.3K0
AI进了直播间,这画风666
iSee:深度学习“摘眼镜”,用集成数据训练神经网络识别抽象物体
【新智元导读】Saleforce Einstein 的机器学习工程师 Melissa Runfeldt 开发了一款可以摘除眼镜的深度学习应用方法——iSee,效果非常自然。深度学习的应用非常广泛,这个有趣的应用证明集成数据可以用于训练神经网络,识别并去除图像中的抽象物体。 2016 夏季硅谷数据科学大会上,就职于 Saleforce Einstein 的机器学习工程师 Melissa Runfeldt 展出了自己的研究成果,她开发了一款可以摘除眼镜的深度学习应用方法——iSee。 戴眼镜的朋友们应该都不陌生
新智元
2018/03/26
1.9K0
iSee:深度学习“摘眼镜”,用集成数据训练神经网络识别抽象物体
美颜SDK:抖音、微信都在用,10秒大型场景仅100KB!
短视频SDK、直播SDK接入,超低占用空间,十秒大型场景仅100KB+ 精准人脸识别,动态捕捉最优人脸画面 无限炫酷特效,支持Android、IOS系统。
BestSDK
2018/07/30
4.2K0
美颜SDK:抖音、微信都在用,10秒大型场景仅100KB!
Portraiture 5最新版插件PS滤镜
Portraiture 5是一款PS磨皮滤镜,减少了人工选择图像区域的重复劳动。它能智能地对图像中的皮肤材质、头发、眉毛、睫毛等部位进行平滑和减少疵点处理,效果相当优秀;
用户7442547
2022/07/26
4.6K0
从底层技术到直播美颜SDK插件的全流程开发指南
在当今的直播和视频通话应用中,美颜功能已成为提升用户体验的关键要素。澜极美颜SDK凭借其强大的技术架构和丰富的功能,为开发者提供了一个高效、灵活的解决方案。本文将从澜极美颜SDK的底层技术剖析到直播美颜插件的全流程开发,帮助开发者深入了解其技术架构和实现逻辑,确保在实际项目中高效应用。
澜极美颜SDK
2025/02/13
1970
从底层技术到直播美颜SDK插件的全流程开发指南
【杂谈】如果你想快速系统掌握计算机视觉大部分领域,学习人脸图像是唯一选择
笔者是从传统图像算法开始进入计算机视觉行业的,那一批人基本上都是从人脸图像和文本图像开始学,而如今很多计算机视觉从业者却从来没有接触过人脸图像相关的算法,或许真的是时代变了吧。
用户1508658
2020/08/28
1.5K0
【杂谈】如果你想快速系统掌握计算机视觉大部分领域,学习人脸图像是唯一选择
AI魔幻行为大赏:细数机器视觉的9大应用场景
导读:本文主要介绍了机器视觉的主要应用场景,目前绝大部分数字信息都是以图片或视频的形式存在的,若要对这些信息进行有效分析利用,则要依赖于机器视觉技术的发展,虽然目前已有的技术已经能够解决很多问题,但离解决所有问题还很遥远,因此机器视觉的应用前景还是非常广阔的。
IT阅读排行榜
2019/07/24
1.2K0
AI魔幻行为大赏:细数机器视觉的9大应用场景
视频精修一帧要花2小时?美图影像研究院的AI只要5.3毫秒!
进入全民短视频时代,人像视频的拍摄也正在迈向专业化。随着固化审美的瓦解,十级磨皮的网红滤镜被打破,多元化的高级质感成为新的风向标,「美」到每一帧是人们对动态视频提出的更高要求。
机器之心
2021/12/13
9950
视频精修一帧要花2小时?美图影像研究院的AI只要5.3毫秒!
直播系统开发:关于直播源码中美颜SDK的作用
美颜、美型、滤镜等功能已经是拍照类APP的标配,直播系统开发中也更是离不开这些功能。拍照拍视频或者开启直播时,总希望能够加一些萌萌的兔耳朵,或者一些更复杂的3D人脸面具等特效。但是由于这类技术涉及人脸追踪,以及图形渲染等技术,想要自己从零开始研发,调试会消耗大量的时间和成本,而所有成解决方案的服务一定都是成本最低的,那么拍摄类、视频社交类APP都会使用第三方SDK来实现这些功能。通过加入美颜SDK让直播源码作为直播行业生命力具体的展示。我们来看一下加入美颜SDK后,直播源码作为一块基石,是怎样得到广大用户的喜爱的?
布谷安妮
2020/10/27
2.8K0
直播系统开发:关于直播源码中美颜SDK的作用
Portraiture4最新li磨皮滤镜插件
Portraiture4是一款智能磨皮的滤镜插件,该插件能够给Photoshop和Lightroom添加智能磨皮美化功能,可以帮助用户快速对图片中的人物的皮肤、头发、眉毛等部位进行美化,省去了手动调整的麻烦,大大提高P图的效率。Portraiture这是一款适用于PS和LR的磨皮滤镜插件,操作简便、省去了选择蒙版和逐步像素处理的繁琐流程,帮助您实现高效的肖像修饰。新一代的皮肤平滑,修复和增强软件建立在第2版的技术上,具有两倍的速度和性能,加上输出质量的细化,产生一致和令人满意的修饰效果。
用户7442547
2023/02/09
2K0
人脸到底是怎样识别的
人脸识别技术原理简单来讲主要是三大步骤:一是建立一个包含大批量人脸图像的数据库,二是通过各种方式来获得当前要进行识别的目标人脸图像,三是将目标人脸图像与数据库中既有的人脸图像进行比对和筛选。根据人脸识别技术原理具体实施起来的技术流程则主要包含以下四个部分,即人脸图像的采集与预处理、人脸检测、人脸特征提取、人脸识别和活体鉴别。
刘盼
2018/12/28
2.7K0
人脸到底是怎样识别的
推荐阅读
相关推荐
【深度算法】APP直播想实现“逆天”美颜,你只需要一个人脸识别API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档