HarmonyOS鸿蒙Next中如何实现grid分列显示还有头部header标题效果,还能上拉加载更多
HarmonyOS鸿蒙Next中如何实现grid分列显示还有头部header标题效果,还能上拉加载更多 如何实现grid分列显示还有头部header标题效果,还能上拉加载更多
3 回复
import HashMap from '@ohos.util.HashMap';
class BasicDataSource implements IDataSource {
private listeners: DataChangeListener[] = [];
private originDataArray: Array<TimeTable> | Array<Projects> = [];
public totalCount(): number {
return 0;
}
public getData(index: number): TimeTable | Projects {
return this.originDataArray[index];
}
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
console.info('add listener');
this.listeners.push(listener);
}
}
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener);
if (pos >= 0) {
console.info('remove listener');
this.listeners.splice(pos, 1);
}
}
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded();
})
}
notifyDataAdd(index: number): void {
this.listeners.forEach(listener => {
listener.onDataAdd(index);
})
}
notifyDataChange(index: number): void {
this.listeners.forEach(listener => {
listener.onDataChange(index);
})
}
notifyDataDelete(index: number): void {
this.listeners.forEach(listener => {
listener.onDataDelete(index);
})
}
notifyDataMove(from: number, to: number): void {
this.listeners.forEach(listener => {
listener.onDataMove(from, to);
})
}
}
class MyDataSource extends BasicDataSource {
private dataArray: TimeTable[] | Array<Projects> = []
constructor(Datas: Array<TimeTable> | Array<Projects>) {
super()
this.dataArray = Datas
}
public totalCount(): number {
return this.dataArray.length;
}
public getData(index: number): TimeTable | Projects {
return this.dataArray[index];
}
public addDataTimeTable(index: number, data: TimeTable ): void {
this.dataArray.splice(index, 0, data);
this.notifyDataAdd(index);
}
public addDataString(index: number, data: Projects): void {
this.dataArray.splice(index, 0, data);
this.notifyDataAdd(index);
}
public pushDataTimeTable(data: TimeTable): void {
(this.dataArray as Array<TimeTable>).push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
public pushDataString(data: string): void {
(this.dataArray as Array<string>).push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
}
@Entry
@Component
struct ListItemGroupExample {
@State isEdit:boolean = false;
private timeTable: TimeTable[] = [
{
title: 'item1',
projects: [new Projects('app.media.background',false),new Projects('app.media.foreground',false),new Projects('app.media.startIcon',false)]
},
{
title: 'item2',
projects: [new Projects('app.media.background',false),new Projects('app.media.foreground',false),new Projects('app.media.startIcon',false)]
},
{
title: 'item3',
projects: [new Projects('app.media.background',false),new Projects('app.media.foreground',false),new Projects('app.media.startIcon',false)]
},
]
private dataProjects: MyDataSource = new MyDataSource(this.timeTable);
private hashMap: HashMap<Projects[],MyDataSource> = new HashMap();
aboutToAppear(): void {
for (let index = 0; index < this.timeTable.length; index++) {
this.hashMap.set(this.timeTable[index].projects, new MyDataSource(this.timeTable[index].projects))
}
}
@Builder
itemHead(text: string) {
Text(text)
.fontSize(14)
.width("100%")
.padding(10)
}
build() {
Column () {
Text(this.isEdit? '取消编辑':'编辑').onClick(() => {
this.isEdit = !this.isEdit;
}).width('100%').backgroundColor(Color.Yellow).height(20).textAlign(TextAlign.Center)
if (this.isEdit) {
Text('确定删除').onClick(() => {
this.isEdit = !this.isEdit;
}).width('100%').backgroundColor(Color.Red).height(20).textAlign(TextAlign.Center).onClick(() => {
this.deleteClick();
})
}
List({ space: 20 }) {
LazyForEach(this.dataProjects, (item: TimeTable) => {
ListItemGroup({ header: this.itemHead(item.title)}) {
ListItem() {
Grid() {
LazyForEach(this.hashMap.get(item.projects), (projects: Projects) => {
GridItem() {
ViewA({isEdit:this.isEdit,project:projects})
}.width(50).height(50)
}, (projects: Projects) => projects.name)
}
.columnsGap(10)
.rowsGap(10)
.maxCount(6)
.minCount(2)
.cellLength(0)
.layoutDirection(GridDirection.Row)
}
})
}
.width('90%')
.sticky(StickyStyle.Header | StickyStyle.Footer)
.scrollBar(BarState.Off)
}.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
}
//删除刷新
deleteClick() {
}
}
@Component
struct ViewA {
@Link isEdit?:boolean;
@ObjectLink project: Projects;
build() {
if (this.isEdit) {
Stack(){
Image($r(this.project.name)).width(50).height(50).onClick(() => {
this.project.isSelect = !this.project.isSelect
})
if (this.project.isSelect) {
// 选中状态遮罩层
Row().width(50).height(50).backgroundColor(Color.Red).onClick(() => {
this.project.isSelect = !this.project.isSelect
})
}
}
} else {
Image($r(this.project.name)).width(50).height(50)
}
}
}
interface TimeTable {
title:string,
projects:Projects[]
}
@Observed
class Projects {
name?:string;
isSelect?:boolean;
constructor(name:string,isSelect:boolean) {
this.name = name;
this.isSelect = this.isSelect;
}
}
更多关于HarmonyOS鸿蒙Next中如何实现grid分列显示还有头部header标题效果,还能上拉加载更多的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,实现grid分列显示、头部header标题效果以及上拉加载更多功能,可以通过以下步骤进行:
-
Grid分列显示:
- 使用
GridContainer
组件来实现网格布局。GridContainer
可以设置列数和行数,通过GridItem
来填充每个网格的内容。 - 示例代码:
GridContainer({ columns: 2 }) { ForEach(this.dataList, (item) => { GridItem() { Text(item.name) } }) }
- 使用
-
头部header标题效果:
- 使用
Column
组件来布局,将Text
组件放在GridContainer
上方作为标题。 - 示例代码:
Column() { Text('Header Title') .fontSize(20) .margin({ bottom: 10 }) GridContainer({ columns: 2 }) { ForEach(this.dataList, (item) => { GridItem() { Text(item.name) } }) } }
- 使用
-
上拉加载更多:
- 使用
List
组件的onReachEnd
事件来实现上拉加载更多功能。当用户滚动到列表底部时,触发该事件并加载更多数据。 - 示例代码:
List() { ForEach(this.dataList, (item) => { ListItem() { Text(item.name) } }) } .onReachEnd(() => { this.loadMoreData(); })
- 使用
通过上述方法,可以在HarmonyOS鸿蒙Next中实现grid分列显示、头部header标题效果以及上拉加载更多功能。
在HarmonyOS鸿蒙Next中,可以通过ListContainer
组件实现grid分列显示和头部header标题效果,并支持上拉加载更多。首先,使用ListContainer
的GridLayoutManager
设置分列布局,通过HeaderViewHolder
添加头部标题。然后,监听ListContainer
的滚动事件,在滚动到底部时触发加载更多数据的逻辑。具体实现步骤包括:
- 配置
GridLayoutManager
; - 创建并绑定
HeaderViewHolder
; - 实现上拉加载的逻辑。