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
开发者您好,
请问是想实现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本身不直接支持这种二维分组。替代方案可以考虑:
-
数据预处理:将原始数据按需分组,每组数据作为一个Swiper项,在项内使用Grid或Flex布局实现多行多列显示。
-
嵌套布局:如果每组结构复杂,可以在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的单页切换,实现视觉上的“纵向分组”效果。

