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标题效果以及上拉加载更多功能,可以通过以下步骤进行:

  1. Grid分列显示

    • 使用GridContainer组件来实现网格布局。GridContainer可以设置列数和行数,通过GridItem来填充每个网格的内容。
    • 示例代码:
      GridContainer({ columns: 2 }) {
        ForEach(this.dataList, (item) => {
          GridItem() {
            Text(item.name)
          }
        })
      }
      
  2. 头部header标题效果

    • 使用Column组件来布局,将Text组件放在GridContainer上方作为标题。
    • 示例代码:
      Column() {
        Text('Header Title')
          .fontSize(20)
          .margin({ bottom: 10 })
        GridContainer({ columns: 2 }) {
          ForEach(this.dataList, (item) => {
            GridItem() {
              Text(item.name)
            }
          })
        }
      }
      
  3. 上拉加载更多

    • 使用List组件的onReachEnd事件来实现上拉加载更多功能。当用户滚动到列表底部时,触发该事件并加载更多数据。
    • 示例代码:
      List() {
        ForEach(this.dataList, (item) => {
          ListItem() {
            Text(item.name)
          }
        })
      }
      .onReachEnd(() => {
        this.loadMoreData();
      })
      

通过上述方法,可以在HarmonyOS鸿蒙Next中实现grid分列显示、头部header标题效果以及上拉加载更多功能。

在HarmonyOS鸿蒙Next中,可以通过ListContainer组件实现grid分列显示和头部header标题效果,并支持上拉加载更多。首先,使用ListContainerGridLayoutManager设置分列布局,通过HeaderViewHolder添加头部标题。然后,监听ListContainer的滚动事件,在滚动到底部时触发加载更多数据的逻辑。具体实现步骤包括:

  1. 配置GridLayoutManager
  2. 创建并绑定HeaderViewHolder
  3. 实现上拉加载的逻辑。
回到顶部