1/* 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15import { ListInfo } from '../model/ListInfo'; 16import { MEMO_DATA } from '../model/MockData'; 17import { ListExchange } from '../utils/ListExchange'; 18import { ListExchangeCtrl } from '../model/ListExchangeCtrl'; 19 20const ITEM_HEIGHT: number = 50; // 列表项高度 21 22/** 23 * 功能说明: 本示例通过List组件、组合手势GestureGroup、swipeAction属性以及attributeModifier属性等实现了列表项的交换和删除。 24 * 推荐场景: 扣款列表 25 * 26 * 核心组件: 27 * 1. ListExchange: 自定义列表交换视图组件 28 * 2. ListInfo: 设置列表项元素的类 29 * 30 * 实现步骤: 31 * 1.设置列表项元素的类。开发者可以根据自身业务列表项的需求场景自行配置。 32 * class ListInfo { 33 icon: ResourceStr = ''; 34 name: ResourceStr = ''; 35 36 constructor(icon: ResourceStr = '', name: ResourceStr = '') { 37 this.icon = icon; 38 this.name = name; 39 } 40 } 41 * 42 * 2. 数据准备。首先构建一个ListInfo数组,然后向其中传入对应的内容数据。 43 * @example 44 * const MEMO_DATA: ListInfo[] = [ 45 new ListInfo($r("app.media.list_exchange_ic_public_cards_filled"), '账户余额'), 46 new ListInfo($r("app.media.list_exchange_ic_public_cards_filled2"), 'xx银行储蓄卡(1234)'), 47 new ListInfo($r("app.media.list_exchange_ic_public_cards_filled3"), 'xx银行储蓄卡(1238)'), 48 new ListInfo($r("app.media.list_exchange_ic_public_cards_filled4"), 'xx银行储蓄卡(1236)')]; 49 * @State appInfoList: ListInfo[] = MEMO_DATA; 50 * 51 * 3. 声明管理列表项交换的类ListExchangeCtrl。通过ListExchangeCtrl来实现列表项与列表项之间的位置交换。具体实现请看后续的实现步骤章节。 52 * 列表项交换类 53 * @State listExchangeCtrl: ListExchangeCtrl<ListInfo> = new ListExchangeCtrl(); 54 55 * 4.自定义列表项组件。 56 * listItemInfo: 列表项数据信息 57 * @Builder deductionView(listItemInfo: ListInfo) {...} 58 * 59 * 5. 构建自定义列表视图。在代码合适的位置使用ListExchange组件并传入对应的参数。 60 * @example 61 * 列表交换视图 62 * appInfoList: 数据源 63 * listExchangeCtrl: 列表项交换类 64 * deductionView: 列表项视图 65 * ListExchange({ 66 appInfoList: this.appInfoList, 67 listExchangeCtrl: this.listExchangeCtrl, 68 deductionView: (listItemInfo: Object) => { 69 this.deductionView(listItemInfo as Listinfo) 70 } 71 }) 72 */ 73 74@Component 75export struct ListExchangeViewComponent { 76 // 初始化列表数据 77 @State appInfoList: ListInfo[] = MEMO_DATA; 78 // 列表项元素交换类 79 @State listExchangeCtrl: ListExchangeCtrl<ListInfo> = new ListExchangeCtrl(); 80 81 aboutToAppear(): void { 82 this.listExchangeCtrl.initData(this.appInfoList); 83 } 84 85 build() { 86 Column() { 87 // 标题栏 88 Row() { 89 Text($r('app.string.list_exchange_deduction_sort')) 90 .textAlign(TextAlign.Start) 91 Blank() 92 Text($r('app.string.list_exchange_custom_sort')) 93 } 94 .backgroundColor(Color.White) 95 .border({ 96 radius: { 97 topLeft: $r('app.string.ohos_id_corner_radius_default_l'), 98 topRight: $r('app.string.ohos_id_corner_radius_default_l') 99 } 100 }) 101 .padding({ 102 left: $r('app.string.ohos_id_card_padding_start'), 103 right: $r('app.string.ohos_id_card_padding_start') 104 }) 105 .width('100%') 106 .height($r('app.integer.list_exchange_title_height')) 107 108 /** 109 * 列表交换视图 110 * appInfoList: 数据源 111 * listExchangeCtrl: 列表项交换类 112 * deductionView: 列表项视图 113 */ 114 ListExchange({ 115 appInfoList: this.appInfoList, 116 listExchangeCtrl: this.listExchangeCtrl, 117 deductionView: (listItemInfo: Object) => { 118 this.deductionView(listItemInfo as ListInfo) 119 } 120 }) 121 } 122 .height('100%') 123 .width('100%') 124 .justifyContent(FlexAlign.Center) 125 .backgroundColor($r('app.color.list_exchange_background_color')) 126 .padding({ left: $r('app.string.ohos_id_card_padding_start'), right: $r('app.string.ohos_id_card_padding_start') }) 127 } 128 129 /** 130 * ListItem自定义组件(开发者可以根据自己的需求设置列表项的UI) 131 */ 132 @Builder 133 deductionView(listItemInfo: ListInfo) { 134 Row() { 135 Image(listItemInfo.icon) 136 .width($r('app.integer.list_exchange_icon_size')) 137 .height($r('app.integer.list_exchange_icon_size')) 138 .draggable(false) // TODO:知识点:保持默认值true时,图片有默认拖拽效果,会影响Grid子组件拖拽判断,所以修改为false 139 Text(listItemInfo.name) 140 .margin({ left: $r('app.string.ohos_id_elements_margin_vertical_l') }) 141 Blank() 142 Image($r('app.media.list_exchange_ic_public_drawer')) 143 .width($r('app.integer.list_exchange_icon_size')) 144 .height($r('app.integer.list_exchange_icon_size')) 145 .objectFit(ImageFit.Cover) 146 .draggable(false) // TODO:知识点:保持默认值true时,图片有默认拖拽效果,会影响Grid子组件拖拽判断,所以修改为false 147 } 148 .width('100%') 149 .height(ITEM_HEIGHT) 150 .backgroundColor(Color.White) 151 .padding({ 152 left: $r('app.string.ohos_id_card_padding_start'), 153 right: $r('app.string.ohos_id_card_padding_start') 154 }) 155 } 156}