当前位置:   article > 正文

鸿蒙开发入门教程—瀑布流的实战案例_鸿蒙瀑布流

鸿蒙瀑布流

给大家分享一下瀑布流的实战案例,和官方文档略有不同,本文数据直接从api接口获取,更接近实战。需要注意的是,要实现瀑布流,接口最好将图片尺寸一起返回。

本文效果图:

首先要实现IDataSource接口的对象,用于瀑布流组件加载数据:

  1. export class WaterFlowDataSource implements IDataSource {
  2. private dataArray: Object[] = []
  3. private listeners: DataChangeListener[] = []
  4. constructor() {
  5. let url = "http://youlanjihua.com/AIImage/wallpaper.php?classId=2"
  6. HttpManager.getInstance().request({
  7. method: RequestMethod.GET,
  8. url: url
  9. }).then((result:object)=>{
  10. let str = JSON.stringify(result)
  11. let strArr:Object[] = JSON.parse(str)
  12. for (let i = 0; i < strArr.length; i++) {
  13. this.dataArray.push(strArr[i])
  14. }
  15. this.notifyDataReload()
  16. })
  17. }
  18. // 获取索引对应的数据
  19. public getData(index: number): Object {
  20. return this.dataArray[index]
  21. }
  22. // 通知控制器数据重新加载
  23. notifyDataReload(): void {
  24. this.listeners.forEach(listener => {
  25. listener.onDataReloaded()
  26. })
  27. }
  28. // 通知控制器数据增加
  29. notifyDataAdd(index: number): void {
  30. this.listeners.forEach(listener => {
  31. listener.onDataAdded(index)
  32. })
  33. }
  34. // 通知控制器数据变化
  35. notifyDataChange(index: number): void {
  36. this.listeners.forEach(listener => {
  37. listener.onDataChanged(index)
  38. })
  39. }
  40. // 通知控制器数据删除
  41. notifyDataDelete(index: number): void {
  42. this.listeners.forEach(listener => {
  43. listener.onDataDeleted(index)
  44. })
  45. }
  46. // 通知控制器数据位置变化
  47. notifyDataMove(from: number, to: number): void {
  48. this.listeners.forEach(listener => {
  49. listener.onDataMoved(from, to)
  50. })
  51. }
  52. // 获取数据总数
  53. public totalCount(): number {
  54. return this.dataArray.length
  55. }
  56. // 注册改变数据的控制器
  57. registerDataChangeListener(listener: DataChangeListener): void {
  58. if (this.listeners.indexOf(listener) < 0) {
  59. this.listeners.push(listener)
  60. }
  61. }
  62. // 注销改变数据的控制器
  63. unregisterDataChangeListener(listener: DataChangeListener): void {
  64. const pos = this.listeners.indexOf(listener)
  65. if (pos >= 0) {
  66. this.listeners.splice(pos, 1)
  67. }
  68. }
  69. // 增加数据
  70. public Add1stItem(): void {
  71. this.dataArray.splice(0, 0, this.dataArray.length)
  72. this.notifyDataAdd(0)
  73. }
  74. // 在数据尾部增加一个元素
  75. public AddLastItem(): void {
  76. this.dataArray.splice(this.dataArray.length, 0, this.dataArray.length)
  77. this.notifyDataAdd(this.dataArray.length-1)
  78. }
  79. // 在指定索引位置增加一个元素
  80. public AddItem(index: number): void {
  81. this.dataArray.splice(index, 0, this.dataArray.length)
  82. this.notifyDataAdd(index)
  83. }
  84. // 删除第一个元素
  85. public Delete1stItem(): void {
  86. this.dataArray.splice(0, 1)
  87. this.notifyDataDelete(0)
  88. }
  89. // 删除第二个元素
  90. public Delete2ndItem(): void {
  91. this.dataArray.splice(1, 1)
  92. this.notifyDataDelete(1)
  93. }
  94. // 删除最后一个元素
  95. public DeleteLastItem(): void {
  96. this.dataArray.splice(-1, 1)
  97. this.notifyDataDelete(this.dataArray.length)
  98. }
  99. // 重新加载数据
  100. public Reload(): void {
  101. this.dataArray.splice(1, 1)
  102. this.dataArray.splice(3, 2)
  103. this.notifyDataReload()
  104. }
  105. }

然后使用WaterFlow组件展示数据:

  1. import { HttpManager } from '../../library/httpTool/HttpManager';
  2. import { RequestMethod } from '../../library/httpTool/RequestOptions';
  3. import display from '@ohos.display';
  4. @Entry
  5. @Component
  6. export struct Home {
  7. @State dataSource: WaterFlowDataSource = new WaterFlowDataSource()
  8. @State item_width:number = (px2vp(display.getDefaultDisplaySync().width) - 5)/2
  9. build() {
  10. Column({ space: 2 }) {
  11. WaterFlow() {
  12. LazyForEach(this.dataSource, (item: object,index:number) => {
  13. FlowItem() {
  14. Column() {
  15. Image("http://youlanjihua.com/AIImage/wallpaper/compressSize/l_" + item['cover'])
  16. .objectFit(ImageFit.Fill)
  17. .width('100%')
  18. .layoutWeight(1)
  19. }
  20. }
  21. .width('100%')
  22. .height(this.item_width * item['height']/item['width'])
  23. .backgroundColor('#ececec')
  24. }, (item: string) => item)
  25. }
  26. .columnsTemplate("1fr 1fr")
  27. .columnsGap(5)
  28. .rowsGap(5)
  29. .backgroundColor(Color.White)
  30. .width('100%')
  31. .height('100%')
  32. }
  33. }
  34. }

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→《鸿蒙星河版开发教程指南

鸿蒙(Harmony NEXT)最新学习路线

有了路线图,怎么能没有学习资料呢,小编也准备了几套HarmonyOS NEXT学习视频 内容包含以下联

内容包含:ArkTS、TypeScript、ArkUI、资源分类…等知识点。

获取完整版高清学习路线,请点击→《HarmonyOS教学视频

HarmonyOS教学视频

鸿蒙语法ArkTS、TypeScript、ArkUI等.....视频教程

鸿蒙生态应用开发白皮书V2.0PDF:

获取白皮书:请点击→《鸿蒙生态应用开发白皮书V2.0PDF

鸿蒙 (Harmony OS)开发学习手册

一、入门必看

  1. 应用开发导读(ArkTS)
  2. ……

二、HarmonyOS 概念

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全
  5. ........

三、如何快速入门?《鸿蒙基础入门学习指南

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

四、开发基础知识

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

五、基于ArkTS 开发

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

更多了解更多鸿蒙开发的相关知识可以参考:鸿蒙 (Harmony OS)开发学习手册

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/333470
推荐阅读
相关标签
  

闽ICP备14008679号