ReactNative ListView + 上拉加载更多 + 下拉刷新

最近在尝试RN上的一些编码,感受是编译环境真的很不稳定,有时候添加一个依赖包,直接就导致项目出错了,需要移除重新添加。提醒大家添加依赖组件的时候最好把服务停了,项目停止运行以保证稳定性。
本来用的是FlatList组件,这个新组建用起来简单很多,但是加上逻辑代码会触发很多遍下拉刷新方法,目前没有很好的解决思路,所以换成了老组件ListView,差异不大。

 //1、首先定义换成列表数组信息、当前页码信息的集合
let cacheResults={
  pageIndex:1,
  pageSize:10,
  items:[]
}
//2、定义状态机
  constructor(props) {
    super(props)
    this.state = {
      // data: [],
      data:new ListView.DataSource({
        rowHasChanged:(r1,r2)=>r1!==r2,
      }),
      isFirstLoad: true, //是否是第一次加载,这里为了防止上拉加载更多方法多次触发
      isRefreshing: false, //当前刷新状态
      isLoadingTail: false, //尾部刷新
      isNoMoreData: false, //是否还有数据
    }
  }

 //3、渲染界面
   render() {
    return (
        <View style={styles.container}>
            <ListView
                dataSource={this.state.data}
                renderRow={(rowData) => this.renderRow(rowData)}
                onEndReached={this._loadMoreData}
                onEndReachedThreshold={20}
                renderFooter={this._renderFooter}

                refreshControl={
                    <RefreshControl
                        refreshing={this.state.isRefreshing}
                        onRefresh={this._onRefresh}
                    />
                }
            />

        </View>
    );
}
//4、第一次页码加载完成调用
  componentDidMount() {
    console.log('componentDidMount')
    //发送网络请求
    // this.loadMockData()
    cacheResults.items = []
    cacheResults.nextPage = 1

    this.loadActualData(1)

  }
 //5、下拉刷新
  _onRefresh= () => {

    if(this.state.isRefreshing) {
      return
    }
    cacheResults.nextPage = 1
    this.loadActualData(1)
  }
 //6、上拉加载更多
   _loadMoreData= () => {
    if(this.state.isFirstLoad) { //第一次进来会走一次,这次不触发事件
      this.setState({
        isFirstLoad:false
      });
      return
    }

    if(this.state.isNoMoreData || this.state.isLoadingTail) {//防止多次调用
      return
    }
    cacheResults.nextPage += 1
    let pageIndex = cacheResults.nextPage
    console.log('_loadMoreData'+cacheResults.nextPage)
    this.loadActualData(pageIndex)
  }
 //7、加载数据、处理上拉下拉判断逻辑,这块有开发经验的可以自己写,主要提供思路
 loadActualData(pageIndex) {
    console.log('loadActualData:' + pageIndex)
    if(pageIndex !== 1) {//加载更多
      this.setState({
        isLoadingTail:true
      });
    }else {
      this.setState({
        isRefreshing:true
      })
    }

    let liveStatus = this.state.liveStatus;
    // console.log('liveStatus:'+liveStatus)
    let map = {
      "_from": "yjk", 
      "appId": "101", 
      "pageIndex":pageIndex, 
    }
    let url = config.actualListApi.base + config.actualListApi.subUrl
    request.post(url,map).then((response) => {
    //这边是封装的网络请求方法,自己写代替
      // console.log('response.code'+response.code)
      // console.log('response.msg'+response.msg)
      // console.log('网络请求结果'+JSON.stringify(response.data))
      if (response.code === 200) {//网络请求成功
        let list = response.data.list
        let items = cacheResults.items.slice()
        if(pageIndex !== 1) {
          items = items.concat(list)
        }else {
          items = list
        }

        //保存数据
        cacheResults.items = items
        console.log('当前到了第:'+cacheResults.items.length+'个!');

        // 默认每十条为一页,不足十条,则说明没有更多数据
        if(list.length < 10) {
          console.log('<10');
          this.setState({
            isNoMoreData: true
          });
        }else {
          console.log('>=10');
          this.setState({
            isNoMoreData: false
          });
        }
          if(pageIndex !== 1) {//加载更多
            this.setState({
              // data: cacheResults.items,
              data:this.state.data.cloneWithRows(
                cacheResults.items
              ),
              isLoadingTail:false
            });
          }else{//加载新数据
            this.setState({
              data:this.state.data.cloneWithRows(
                cacheResults.items
              ),
              isRefreshing:false
            });
          }
      } 
    }).catch((error) => { //如果出错
      console.log('网络请求出错'+error);
      if(pageIndex !== 1) {
        this.setState({
          isLoadingTail:false
        });
      }else {
        this.setState({
          isRefreshing:false
        });
      }
    })
  }
 //这边是UI界面绘制
   // cell
  renderRow(item) {
    return (
      <StreamCell rowData={item}/>
    )
  }
//顶部用得是自带的菊花,不需要特地去重写
//自定义Footer视图
  _renderFooter = ()=>{
    if(this.state.isNoMoreData){
        return(
            <View style={styles.loadingMore}>
                <Text style={styles.loadingText}>没有更多数据啦...</Text>
            </View>
        );
    }

    //显示一朵小菊花!!
    return(
        <ActivityIndicator
            style={styles.loadingMore}
        />
    )
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值