使用 Scroll 及其 nested 属性,实现一个有 header ,body 为 Tabs,Tabcontent 里面为 List

使用 Scroll 及其 nested 属性,实现一个有 header ,body 为 Tabs,Tabcontent 里面为 List,使用 PullToRefresh 如何实现每个列表的下拉刷新和上拉加载,并能和最外层 Scroll 实现滚动的联动。

HarmonyOS
2024-10-08 12:59:30
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

可以引入三方库 PullToRefresh 来实现 上拉加载和下拉刷新

地址:https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fpulltorefresh

参考demo:

// PullRefreshPage.ets  
import { PullToRefresh, PullToRefreshConfigurator } from '@ohos/pulltorefresh'  
  
@Entry  
@Component  
struct PullRefreshPage {  
  @State currentIndex: number = 0  
  @State refreshText: string = '';  
  private dataNumbers: string[] = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];  
  @State data: string[] = [];  
  private scroller: Scroller = new Scroller();  
  tabController: TabsController = new TabsController()  
  @State refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator()  
  
  aboutToAppear() {  
    for (let i = 0; i < 20; i++) {  
      this.data.push(`列表item${i}`)  
    }  
  }  
  
  build() {  
    Scroll() {  
      Column(){  
        Text("Header")  
          .width("100%")  
          .height(140)  
          .backgroundColor('#0080DC')  
          .textAlign(TextAlign.Center)  
          .onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {  
            if (isVisible && currentRatio >= 1.0) {  
              this.refreshConfigurator.setHasRefresh(true)  
            }  
            if (!isVisible && currentRatio <= 0.0) {  
              this.refreshConfigurator.setHasRefresh(false)  
            }  
          })  
  
        Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.tabController }) {  
          TabContent() {  
            this.listBuilder()  
          }.tabBar(this.TabBuilder('TabItem_1', 0))  
          TabContent() {  
            Column(){  
              Text('TabItem_2的内容')  
            }.width('100%').height('100%').backgroundColor(Color.Pink)  
          }.tabBar(this.TabBuilder('TabItem_2', 1))  
        }  
        .height('100%')  
        .vertical(false)  
        .onChange((index: number) => {  
          this.currentIndex = index  
        })  
      }.width("100%")  
    }  
    .edgeEffect(EdgeEffect.None)  
    .backgroundColor('#DCDCDC')  
    .scrollBar(BarState.Off)  
    .width('100%')  
    .height('100%')  
  }_x000D_  
  /******/_x000D_  
  @Builder TabBuilder(label: string, index: number) {  
    Column() {  
      Text(label)  
        .fontSize(16)  
        .lineHeight(22)  
        .margin({ top: 6, bottom: 6 })  
      Divider()  
        .strokeWidth(2)  
        .width(60)  
        .color('#007DFF')  
        .opacity(this.currentIndex === index ? 1 : 0)  
    }.width('100%')  
  }  
  
  @Builder  
  listBuilder() {  
    PullToRefresh({  
      // 必传项,列表组件所绑定的数据  
      data: $data,  
      // 必传项,需绑定传入主体布局内的列表或宫格组件  
      scroller: this.scroller,  
      // 必传项,自定义主体布局,内部有列表或宫格组件  
      customList: () => {  
        // 一个用@Builder修饰过的UI方法  
        this.getListView();  
      },  
      refreshConfigurator: this.refreshConfigurator,  
      // 可选项,下拉刷新回调  
      onRefresh: () => {  
        return new Promise<string>((resolve, reject) => {  
          // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据  
          setTimeout(() => {  
            resolve('刷新成功');  
            this.data = this.dataNumbers;  
          }, 2000);  
        });  
      },  
      // 可选项,上拉加载更多回调  
      onLoadMore: () => {  
        return new Promise<string>((resolve, reject) => {  
          // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据  
          setTimeout(() => {  
            resolve('');  
            this.data.push("增加的条目" + this.data.length)  
          }, 2000);  
        });  
      },  
      customLoad: null,  
      customRefresh: null,  
    })  
  }  
  
  @Builder  
  private getListView() {  
    List({ space: 10, scroller: this.scroller }) {  
      ForEach(this.data, (item: number) => {  
        ListItem() {  
          Text("item" + item).fontSize(16)  
        }  
        .backgroundColor(Color.White)  
        .height(70)  
        .width("100%")  
        .borderRadius(10)  
      }, (item: string) => item)  
    }.width("100%")  
    .height('100%')  
    .edgeEffect(EdgeEffect.None)  
    .divider({ strokeWidth: 1, color: 0x222222 })  
    .nestedScroll({  
      scrollForward: NestedScrollMode.PARENT_FIRST,  
      scrollBackward: NestedScrollMode.SELF_FIRST  
    })  
  }  
}
分享
微博
QQ
微信
回复
2024-10-08 17:35:26
相关问题
HarmonyOS定义一个map临时变量
444浏览 • 1回复 待解决
周日历滑动,以周一个单位滑动
694浏览 • 1回复 待解决
怎么判断一个APP是否多HAP包结构?
651浏览 • 1回复 待解决
tabs结合scroll实现吸顶效果
1169浏览 • 1回复 待解决