react-native-page-listview使用方法(自定义FlatList/ListView下拉刷新,上拉加载更多,方便的实现分页)
react-native-page-listview
对ListView/FlatList的封装,可以很方便的分页加载网络数据,还支持自定义下拉刷新View和上拉加载更多的View.兼容高版本FlatList和低版本ListVIew.组件会根据你使用的react-native的版本自动选择(高版本使用FlatList,低版本使用ListView)
github地址: https://github.com/geek-prince/react-native-page-listview
npm地址: https://www.npmjs.com/package/react-native-page-listview
安装
npm install react-native-page-listview --save
如何使用
下面说明中的'组件'指的就是当前这个'react-native-page-listview'组件.
首先导入组件
import PageListView from 'react-native-page-listview';
1.不分页,不从网络获取数据(用于本地数组数据的展示)
这时你只需要给组件传递一个数组
let arr=[你要在ListView上展示的数据数组]
在render方法中使用该组件
<PageListView
renderRow={this.renderRow}
refresh={this.refresh}
/>
renderRow方法中需要你指定每一行数据的展示View,与ListView/FlatList的renderRow/renderItem方法相同
renderRow(rowData,index){
return(<View>你的View展示</View>);
}
refresh方法中指定需要展示数据的数组
refresh=(callBack)=>{
callBack(arr);
}
2.不分页,从网络获取数据(用于网络数组数据不多,后端接口没有用分页时)
这时与上面使用方法一致,只需要更改一下refresh方法
refresh=(callBack)=>{
fetch(url)
.then((response)=>response.json())
.then((responseData)=>{
//根据接口返回结果得到数据数组
let arr=responseData.result;
callBack(arr);
});
}
以上这两种方式渲染结果如下(没有下拉刷新和上拉更多):

3.从网络获取数据并分页,不自定义上拉刷新,下拉加载更多View(用于数据较多,需要分页请求数据时)
这时你需要给组件一下几个属性pageLen,renderRow,refresh,loadMore.
<PageListView
pageLen={15}
renderRow={this.renderRow}
refresh={this.refresh}
loadMore={this.loadMore}
/>
pageLen指定你每次调用后端分页接口可以获得多少条数据.
renderRow使用方法和上面相同,渲染每一行的展示.
refresh方法会在你组件一开始加载和你下拉刷新时调用,所以你在这个方法中需要将你从后端分页接口的第一页请求返回的数据通过回调传给组件.
refresh=(callBack)=>{
fetch(分页接口url+'?page=1')
.then((response)=>response.json())
.then((responseData)=>{
//根据接口返回结果得到数据数组
let arr=responseData.result;
callBack(arr);
});
}
loadMore方法会在你下拉加载更多时调用,这时除了callBack还会传给你另一个参数page表示即将要加载的分页数据是第几页,这时你只需要根据page把相应第几页的数组数据通过回调传给组件就行.
loadMore=(page,callback)=>{
fetch(分页接口url+'?page='+page)
.then((response)=>response.json())
.then((responseData)=>{
//根据接口返回结果得到数据数组
let arr=responseData.result;
callBack(arr);
});
};
这种情况下显示的渲染效果为:

4.从网络获取数据并分页,并且自定义下拉刷新,上拉加载更多View
渲染下拉刷新View使用renderRefreshView,且此时需要给定它的高度renderRefreshViewH,渲染加载更多View使用renderLoadMore,渲染没有更多数据的View使用renderNoMore.
<PageListView
pageLen={15}
renderRow={this.renderRow}
refresh={this.refresh}
loadMore={this.loadMore}
//上面四个属性使用方法同上
renderRefreshView={this.renderRefreshView}
renderRefreshViewH={150}
renderLoadMore={this.renderLoadMore}
renderNoMore={this.renderNoMore}
/>
renderRefreshView=()=>{
return(
<View style={{}}>//你对渲染下拉刷新View的代码</View>
);
};
renderLoadMore=()=>{
return(
<View style={{}}>//你对渲染加载更多View的代码</View>
);
};
renderNoMore=()=>{
return(
<View style={{}}>//你对渲染没有更多数据时View的代码</View>
);
};
这种情况下显示的渲染效果为:

拓展
如果你想实现更好看更绚丽的下拉刷新效果,可以像下面这样使用renderRefreshView.
pullState会根据你下拉的状态给你返回相应的字符串:
'': 没有下拉动作时的状态'pulling': 正在下拉并且还没有拉到指定位置时的状态'pullOk': 正在下拉并且拉到指定位置时并且没有松手的状态'pullRelease': 下拉到指定位置后并且松手后的状态
renderRefreshView=(pullState)=>{
switch (pullState){
case 'pullOk':
return <View style={}>
//下拉刷新,下拉到指定的位置时,你渲染的View
</View>;
break;
case 'pullRelease':
return <View style={}>
//下拉刷新,下拉到指定的位置后,并且你松手后,你渲染的View
</View>;
break;
case '':
case 'pulling':
default:
return <View style={}>
//下拉刷新,你正在下拉时还没有拉到指定位置时(或者默认情况下),你渲染的View
</View>;
break;
}
};
这种情况下显示的渲染效果为:

有时候我们不一定会直接渲染从后端取回来的数据,需要对数据进行一些处理,这时可以在组件中加入dealWithDataArrCallBack属性来对数组数据进行一些处理.下面是把从后端取回来的数组进行顺序的颠倒.
<PageListView
//其他的属性...
dealWithDataArrCallBack={(arr)=>{return arr.reverse()}}
/>
另外,FlatList中有个属性为ItemSeparatorComponent是设置每一行View之间分割的View的,自己觉得不错就写到组件里了,兼容ListView.
属性一览表:
| props | 作用 |
|---|---|
| renderRow | 处理”渲染FlatList/ListView的每一行”的方法 |
| refresh | 处理”下拉刷新”或”一开始加载数据”的方法 |
| loadMore | 处理”加载更多”的方法 |
| pageLen | 每个分页的数据数 |
| dealWithDataArrCallBack | 如果需要在用当前后端返回的数组数据进行处理的话,传入回调函数 |
| renderLoadMore | 还有数据可以从后端取得时候渲染底部View的方法 |
| renderNoMore | 没有数据(数据已经从后端全部加载完)是渲染底部View的方法 |
| renderRefreshView | 渲染下拉刷新的View样式 |
| renderRefreshViewH | 渲染下拉刷新的View样式的高度 |
| ItemSeparatorComponent | 渲染每行View之间的分割线View |
| height | 指定组件宽高,不指定时组件flex:1自适应宽高 |
| width | 指定组件宽高,不指定时组件flex:1自适应宽高 |
| FlatList/ListView自身的属性 | 是基于FlatList/ListView,所以可以直接使用他们自身的属性 |
注意:如果屏幕下方有绝对定位的View时,这时组件自适应宽高,下面的一部分内容会被遮挡,这时一个很好的解决方法是在组件下方渲染一个与绝对定位等高的透明View来解决(<View style={{height:你绝对定位View的高度,backgroundColor:'#0000'}}/>).
如果大家觉得我的组件好用的话,帮到你的话,欢迎大家Star,Fork,如果有什么问题的话也可以在github中想我提出,谢谢大家的支持.
react-native-page-listview使用方法(自定义FlatList/ListView下拉刷新,上拉加载更多,方便的实现分页)的更多相关文章
- Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表
本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...
- 自定义ListView下拉刷新上拉加载更多
自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多 Listview现在用的很少了,基本都是使用Recycleview,但是不得不说Listview具有划时 ...
- react-native 自定义 下拉刷新 / 上拉加载更多 组件
1.封装 Scroller 组件 /** * 下拉刷新/上拉加载更多 组件(Scroller) */ import React, {Component} from 'react'; import { ...
- ListView下拉刷新上拉加载更多实现
这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...
- listview下拉刷新上拉加载扩展(二)-仿美团外卖
经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...
- MaterialRefreshLayout+ListView 下拉刷新 上拉加载
效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行. 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种 ...
- ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多
ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...
- listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖
本篇是基于上篇listview下拉刷新上拉加载扩展(二)-仿美团外卖改造而来,主要调整了headview的布局,并加了两个背景动画,看似高大上,其实很简单: as源码地址:http://downloa ...
- 使用MJRefresh自定义下拉刷新,上拉加载动画
有时候我们需要自己设置下拉刷新,上拉加载动画的实现,这里主要是记录下使用MJRefresh自定义下拉刷新,上拉加载动画..... 下拉刷新我们只需要继承MJRefreshGifHeader即可: 实现 ...
随机推荐
- Apache + PHP Yii框架跨域访问API
其实不用在Yii框架中设置任何东西,直接用Ajax调用不同域名的API即可 但是Apache中要这么设置: 首先编辑httpd.conf 去掉这一句的注释:LoadModule headers_ ...
- Redis 常用命令学习一:通用的基本命令
1-链接,如果需要的 Redis 部署在远程机器上,可以通过以下命令链接,其中-h后面跟着主机名,-p后面跟端口名 redis-cli -h 233.2.2.4 -p 666 2-PING 命令用来测 ...
- KMP算法最浅显理解——一看就明白
https://blog.csdn.net/starstar1992/article/details/54913261 说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里 ...
- C - Co-prime
Given a number N, you are asked to count the number of integers between A and B inclusive which are ...
- Beautifulsoup模块基础用法详解
目录 Beautifulsoup模块 官方中文文档 介绍 基本使用 遍历文档树 搜索文档树 五种过滤器 **find_all( name , attrs , recursive , text , ** ...
- idea 编辑器Git暂存区的使用
平时在开发时候 一般线上环境和线下环境区别会很大,所以一下线下的自己测试环境的代码没有如果提交会影响线上环境,所以一般都会使用git的一个暂存区作为临时存放不需要提交的代码,这样每次提交代码都可以在不 ...
- hdu 6053 trick gcd 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)&g ...
- CodeFirst实体类中,为什么都把ICollection<x>定义成virtual?
主要是用于延迟加载,提高性能用的 只有定义成virtual后才可以延迟加载. 延迟加载,默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明,最好的位置是在 DbContext 的构造器中. p ...
- MVC和WebApi中设置Area中的页为首页
拿WebApi为例,我们一般会生成一份帮助文档,帮助文档会在Area中 我们现在要讲帮助文档设为首页 只需在App_Start文件夹下添加 RouteConfig 类 public class Rou ...
- android-studio-ide 安装到运行第一个helloword,坑记录
1: 安装是提示 机器虚拟化问题,系统如开启了Hyper-V,必须关闭服务 2:安装完后,建立第一个项目,gradle build 一直转圈,最后报错 Gradle project sync fai ...