HarmonyOS 鸿蒙Next中swiper按组翻页

HarmonyOS 鸿蒙Next中swiper按组翻页 // xxx.ets

class MyDataSource implements IDataSource { private list: number[] = []; constructor(list: number[]) { this.list = list; } totalCount(): number { return this.list.length; } getData(index: number): number { return this.list[index]; } registerDataChangeListener(listener: DataChangeListener): void { } unregisterDataChangeListener() { } }

@Entry @Component struct SwiperExample { private swiperController: SwiperController = new SwiperController(); private data: MyDataSource = new MyDataSource([]); aboutToAppear(): void { let list: number[] = []; for (let i = 1; i <= 10; i++) { list.push(i); } this.data = new MyDataSource(list); } build() { Column({ space: 5 }) { Swiper(this.swiperController) { LazyForEach(this.data, (item: string) => { Text(item.toString()) .width(‘90%’) .height(160) .backgroundColor(0xAFEEEE) .textAlign(TextAlign.Center) .fontSize(30) }, (item: string) => item) } .displayCount(3, true) // 开启按组翻页:每页显示3个轮播项,且翻页时整组切换 .autoPlay(true) .interval(4000) .loop(true) .duration(1000) .itemSpace(10) .indicator( // 设置圆点导航点样式 new DotIndicator() .itemWidth(15) .itemHeight(15) .selectedItemWidth(15) .selectedItemHeight(15) .color(Color.Gray) .selectedColor(Color.Blue)) Row({ space: 12 }) { Button(‘showNext’) .onClick(() => { this.swiperController.showNext(); }) Button(‘showPrevious’) .onClick(() => { this.swiperController.showPrevious(); }) }.margin(5) }.width(‘100%’) .margin({ top: 5 }) } }

以上是官方文档代码, 只有横向分组, 没有纵向分组


更多关于HarmonyOS 鸿蒙Next中swiper按组翻页的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

开发者您好,

请问是想实现swiper上下滑动的组翻页还是横向滑动的纵向多行多列呢?

swiper上下滑动的组翻页,添加.vertical(true)属性:

// xxx.ets
class MyDataSource implements IDataSource {
  private list: number[] = [];

  constructor(list: number[]) {
    this.list = list;
  }

  totalCount(): number {
    return this.list.length;
  }

  getData(index: number): number {
    return this.list[index];
  }

  registerDataChangeListener(listener: DataChangeListener): void {
  }

  unregisterDataChangeListener() {
  }
}

@Entry
@Component
struct SwiperExample {
  private swiperController: SwiperController = new SwiperController();
  private data: MyDataSource = new MyDataSource([]);

  aboutToAppear(): void {
    let list: number[] = [];
    for (let i = 1; i <= 10; i++) {
      list.push(i);
    }
    this.data = new MyDataSource(list);
  }

  build() {
    Column({ space: 5 }) {
      Swiper(this.swiperController) {
        LazyForEach(this.data, (item: string) => {
          Text(item.toString())
            .width('90%')
            .height(160)
            .backgroundColor(0xAFEEEE)
            .textAlign(TextAlign.Center)
            .fontSize(30)
        }, (item: string) => item)
      }
      .displayCount(3, true) // 开启按组翻页:每页显示3个轮播项,且翻页时整组切换
      .autoPlay(true)
      .interval(4000)
      .loop(true)
      .duration(1000)
      .itemSpace(10)
      .vertical(true)
      .height('90%')
      .indicator( // 设置圆点导航点样式
        new DotIndicator()
          .itemWidth(15)
          .itemHeight(15)
          .selectedItemWidth(15)
          .selectedItemHeight(15)
          .color(Color.Gray)
          .selectedColor(Color.Blue))

      Row({ space: 12 }) {
        Button('showNext')
          .onClick(() => {
            this.swiperController.showNext();
          })
        Button('showPrevious')
          .onClick(() => {
            this.swiperController.showPrevious();
          })
      }.margin(5)
    }
    .width('100%')
  }
}

横向滑动的纵向多行多列,swiper嵌套Grid:

@Entry
@Component
struct MultiRowSwiper {
  private data: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  private itemsPerPage: number = 4; // 每页显示4个
  private swiperController: SwiperController = new SwiperController();

  // 将数据按组拆分的辅助函数
  private getPagedData() {
    let pages: number[][] = [];
    for (let i = 0; i < this.data.length; i += this.itemsPerPage) {
      pages.push(this.data.slice(i, i + this.itemsPerPage));
    }
    return pages;
  }

  build() {
    Column() {
      Swiper(this.swiperController) {
        ForEach(this.getPagedData(), (pageItems: number[]) => {
          // 每一页都是一个 Grid 网格
          Grid() {
            ForEach(pageItems, (item: number) => {
              GridItem() {
                Text(item.toString())
                  .fontColor(Color.White)
                  .backgroundColor(0x007DFF)
                  .width('100%')
                  .height(20)
                  .textAlign(TextAlign.Center)
                  .borderRadius(10)
              }
            })
          }
          .columnsTemplate('1fr') // 1列(1fr) 2列(1fr 1fr)
          .rowsTemplate('1fr 1fr 1fr 1fr') // 4行
          .columnsGap(10)
          .rowsGap(10)
          .padding(10)
          .height(220) // 根据内容计算高度
        })
      }
      .loop(false)
      .indicator(true)
      .curve(Curve.LinearOutSlowIn)

      Row({ space: 12 }) {
        Button('showNext')
          .onClick(() => {
            this.swiperController.showNext();
          })
        Button('showPrevious')
          .onClick(() => {
            this.swiperController.showPrevious();
          })
      }
    }
    .width('100%')
    .margin({ top: 20 })
  }
}

更多关于HarmonyOS 鸿蒙Next中swiper按组翻页的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


开发者您好,请问以上代码是否符合您的场景,如果不满足能否描述下您具体的场景和实现效果?

HarmonyOS Next中Swiper组件支持按组翻页,通过设置display_count属性实现。该属性指定每页显示的项数,当用户滑动时,Swiper会按组切换整页内容。例如,若display_count设为3,则每次翻页会切换3个项。

在HarmonyOS Next中,Swiper组件通过displayCount方法实现按组翻页功能。根据你提供的代码,.displayCount(3, true)表示每页显示3个轮播项,第二个参数true启用整组切换模式。

关于纵向分组的问题,当前Swiper组件主要设计用于水平方向(horizontal)的轮播布局。虽然可以通过.vertical(true)设置为垂直方向滚动,但displayCount的分组逻辑仍然是按照项目数量进行分组,而非空间布局上的“纵向分组”。

如果你需要实现类似网格状的分组(例如3行2列),目前Swiper本身不直接支持这种二维分组。替代方案可以考虑:

  1. 数据预处理:将原始数据按需分组,每组数据作为一个Swiper项,在项内使用Grid或Flex布局实现多行多列显示。

  2. 嵌套布局:如果每组结构复杂,可以在Swiper的每个项中使用Column/Row组合构建自定义布局。

示例调整思路:

// 将数据预处理为二维数组
let groupedData: number[][] = [];
for (let i = 0; i < list.length; i += 6) { // 假设每组6个元素
    groupedData.push(list.slice(i, i + 6));
}

// Swiper中每个项显示一组
Swiper() {
    ForEach(groupedData, (group) => {
        Column() {
            // 在Column内使用Grid或Flex布局显示6个元素
        }
    })
}

这样可以通过数据层面的分组,配合Swiper的单页切换,实现视觉上的“纵向分组”效果。

回到顶部