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/FlatListrenderRow/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下拉刷新,上拉加载更多,方便的实现分页)的更多相关文章

  1. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  2. 自定义ListView下拉刷新上拉加载更多

    自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多 Listview现在用的很少了,基本都是使用Recycleview,但是不得不说Listview具有划时 ...

  3. react-native 自定义 下拉刷新 / 上拉加载更多 组件

    1.封装 Scroller 组件 /** * 下拉刷新/上拉加载更多 组件(Scroller) */ import React, {Component} from 'react'; import { ...

  4. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  5. listview下拉刷新上拉加载扩展(二)-仿美团外卖

    经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...

  6. MaterialRefreshLayout+ListView 下拉刷新 上拉加载

    效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行. 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种 ...

  7. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

  8. listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖

    本篇是基于上篇listview下拉刷新上拉加载扩展(二)-仿美团外卖改造而来,主要调整了headview的布局,并加了两个背景动画,看似高大上,其实很简单: as源码地址:http://downloa ...

  9. 使用MJRefresh自定义下拉刷新,上拉加载动画

    有时候我们需要自己设置下拉刷新,上拉加载动画的实现,这里主要是记录下使用MJRefresh自定义下拉刷新,上拉加载动画..... 下拉刷新我们只需要继承MJRefreshGifHeader即可: 实现 ...

随机推荐

  1. Java实现无向图的建立与遍历

    一.基于邻接矩阵表示法的无向图 邻接矩阵是一种利用一维数组记录点集信息.二维数组记录边集信息来表示图的表示法,因此我们可以将图抽象成一个类,点集信息和边集信息抽象成类的属性,就可以在Java中描述出来 ...

  2. 关于JS原型以及原型链、instanceof的一些理解

    一.JS原型 首先要区分两个概念 1.构造函数 2.实例:由构造函数通过new方式创建出来的就是实例 <script> function Foo() { } var f = new Foo ...

  3. Java lesson09Homework

    1.   上转型对象的定义是什么?阐述自己对上转型对象的理解,用文字描述. 上转型:父类声明,子类实例化 叫做上转型. (自己的理解)上转型对象可以利用父类中的全员变量和方法,当子类进行全员变量隐藏或 ...

  4. npm无法安装node-sass的解决方法

    使用npm install 命令安装node-sass时,经常出现安装失败的情况.原因在于npm服务器在美国,还有就是某强大的防火墙作用.导致模块无法下载. npm install node-sass ...

  5. 开源跨境ERP - 小老板 Docker/Docker Compose一键部署

    先上部署成功后的截图,各个菜单点击均无报错 DockerCompose 包含: 1. 三个mysql5.7数据库 2. redis php会话存储+ memcached 3. 小老板php主程序 do ...

  6. sql 存储过程笔记3

    16:22 2014/1/26一.定义变量--简单赋值declare @a int set @a = 5 print @a --使用select语句赋值declare @user1 nvarchar( ...

  7. ELK 错误: retrying failed action with response code: 403, kibana无log显示

    今天10点时候同事报出kibana突然不显示log了,开始紧急排查 1. 从数据源头查起,先看被filebeat监视的log文件是否在更新(一般只要log对应服务在正常运行,log文件中就会有数据持续 ...

  8. Image Processing and Analysis_8_Edge Detection:The Design and Use of Steerable Filters——1991

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  9. Django—model系统:ORM对数据库操作

    基本操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): ...

  10. VS---《在VS2010中 使用C++创建和使用DLL》(001)

    VS---<在VS2010中 使用C++创建和使用DLL>(001) 需要学习制作和使用动态库,现在知道:DLL调用有两种方式,一种是静态调用,另外一种是动态调用.详细的还不算明白,等后期 ...