之前使用的组件是ListView,当时要添加一个下拉刷新,上拉加载的功能,所以对ListView做了一些封装,但是后来看官方文档,不建议再使用ListView,因为效率问题,做过Android的朋友都知道,Android的ListView如果不自己处理一下,也是有效率问题的。所以官方又推出了FlatList,而且自带上拉下拉的功能。


功能简介

  • 完全跨平台。
  • 支持水平布局模式。
  • 行组件显示或隐藏时可配置回调事件。
  • 支持单独的头部组件。
  • 支持单独的尾部组件。
  • 支持自定义行间分隔线。
  • 支持下拉刷新。
  • 支持上拉加载。
  • 支持跳转到指定行(ScrollToIndex)。
    如果需要分组/类/区(section),请使用SectionList(这个我们会在之后的文章中介绍)

使用

FlatList如果只做简单使用也是很简单的,这里我们会分难以程度,逐渐介绍:

直接使用

可以看出跟之前的ListView很像,但是其中少了dataSource,这里,我们只需要传递数据,其它的都交给FlatList处理好了。

属性说明

  • ItemSeparatorComponent
    行与行之间的分隔线组件。不会出现在第一行之前和最后一行之后。�在这里可以根据需要插入一个view

  • ListEmptyComponent
    列表为空时渲染该组件。可以是React Component, 也可以是一个render函数, 或者渲染好的element。

  • ListFooterComponent
    尾部组件

  • ListHeaderComponent
    头部组件

  • columnWrapperStyle
    如果设置了多列布局(即将numColumns
    值设为大于1的整数),则可以额外指定此样式作用在每行容器上。

  • data
    为了简化起见,data属性目前只支持普通数组。如果需要使用其他特殊数据结构,例如immutable数组,请直接使用更底层的VirtualizedList
    组件。

  • extraData
    如果有除data以外的数据用在列表中(不论是用在renderItem
    还是Header或者Footer中),请在此属性中指定。同时此数据在修改时也需要先修改其引用地址(比如先复制到一个新的Object或者数组中),然后再修改其值,否则界面很可能不会刷新。

  • getItem
    获取每个Item

  • getItemCount
    获取Item属相

  • getItemLayout
    是一个可选的优化,用于避免动态测量内容尺寸的开销,不过前提是你可以提前知道内容的高度。如果你的行高是固定的getItemLayout
    用起来就既高效又简单,类似下面这样:
    getItemLayout={(data, index) => ( {length: 行高, offset: 行高 * index, index} )}注意如果你指定了SeparatorComponent,请把分隔线的尺寸也考虑到offset的计算之中。

  • horizontal
    设置为true则变为水平布局模式。

  • initialNumToRender
    指定一开始渲染的元素数量,最好刚刚够填满一个屏幕,这样保证了用最短的时间给用户呈现可见的内容。注意这第一批次渲染的元素不会在滑动过程中被卸载,这样是为了保证用户执行返回顶部的操作时,不需要重新渲染首批元素。

  • initialScrollIndex
    指定渲染开始的item index

  • keyExtractor
    此函数用于为给定的item生成一个不重复的key。Key的作用是使React能够区分同类元素的不同个体,以便在刷新时能够确定其变化的位置,减少重新渲染的开销。若不指定此函数,则默认抽取item.key作为key值。若item.key也不存在,则使用数组下标。

  • legacyImplementation
    设置为true则使用旧的ListView的实现。

  • numColumns
    多列布局只能在非水平模式下使用,即必须是horizontal={false}
    。此时组件内元素会从左到右从上到下按Z字形排列,类似启用了flexWrap的布局。组件内元素必须是等高的——暂时还无法支持瀑布流布局。

  • onEndReached
    当列表被滚动到距离内容最底部不足onEndReachedThreshold
    的距离时调用。

  • onEndReachedThreshold
    决定当距离内容最底部还有多远时触发onEndReached
    回调。注意此参数是一个比值而非像素单位。比如,0.5表示距离内容最底部的距离为当前列表可见长度的一半时触发。

  • onRefresh
    如果设置了此选项,则会在列表头部添加一个标准的RefreshControl
    控件,以便实现“下拉刷新”的功能。同时你需要正确设置refreshing
    属性。

  • onViewableItemsChanged
    在可见行元素变化时调用。可见范围和变化频率等参数的配置请设置viewabilityconfig属性

  • refreshing
    在等待加载新数据时将此属性设为true,列表就会显示出一个正在加载的符号。

  • renderItem
    根据行数据data,渲染每一行的组件。这个参照下面的demo

  • viewabilityConfig
    请参考ViewabilityHelper的源码来了解具体的配置。

方法

  • scrollToEnd
    滚动到底部。如果不设置getItemLayout
    属性的话,可能会比较卡。

  • scrollToIndex
    滚动到指定index的item
    如果不设置getItemLayout
    属性的话,无法跳转到当前可视区域以外的位置。

  • scrollToItem
    滚动到指定item,如果不设置getItemLayout
    属性的话,可能会比较卡。

  • scrollToOffset
    滚动指定距离

进阶使用

在这里我准备了一份代码示例:

const {width,height}=Dimensions.get('window')
export default class Main extends Component{
// 构造
constructor(props) {
super(props);
}
refreshing(){
let timer = setTimeout(()=>{
clearTimeout(timer)
alert('刷新成功')
},1500)
}
_onload(){
let timer = setTimeout(()=>{
clearTimeout(timer)
alert('加载成功')
},1500)
}
render() {
var data = [];
for (var i = 0; i < 100; i++) {
data.push({key: i, title: i + ''});
} return (
<View style={{flex:1}}>
<Button title='滚动到指定位置' onPress={()=>{
this._flatList.scrollToOffset({animated: true, offset: 2000});
}}/>
<View style={{flex:1}}>
<FlatList
ref={(flatList)=>this._flatList = flatList}
ListHeaderComponent={this._header}
ListFooterComponent={this._footer}
ItemSeparatorComponent={this._separator}
renderItem={this._renderItem}
onRefresh={this.refreshing}
refreshing={false}
onEndReachedThreshold={0}
onEndReached={
this._onload
}
numColumns ={3}
columnWrapperStyle={{borderWidth:2,borderColor:'black',paddingLeft:20}}
//horizontal={true} getItemLayout={(data,index)=>(
{length: 100, offset: (100+2) * index, index}
)} data={data}>
</FlatList>
</View> </View>
);
} _renderItem = (item) => {
var txt = '第' + item.index + '个' + ' title=' + item.item.title;
var bgColor = item.index % 2 == 0 ? 'red' : 'blue';
return <Text style={[{flex:1,height:100,backgroundColor:bgColor},styles.txt]}>{txt}</Text>
} _header = () => {
return <Text style={[styles.txt,{backgroundColor:'black'}]}>这是头部</Text>;
} _footer = () => {
return <Text style={[styles.txt,{backgroundColor:'black'}]}>这是尾部</Text>;
} _separator = () => {
return <View style={{height:2,backgroundColor:'yellow'}}/>;
} }
const styles=StyleSheet.create({
container:{ },
content:{
width:width,
height:height,
backgroundColor:'yellow',
justifyContent:'center',
alignItems:'center'
},
cell:{
height:100,
backgroundColor:'purple',
alignItems:'center',
justifyContent:'center',
borderBottomColor:'#ececec',
borderBottomWidth:1 },
txt: {
textAlign: 'center',
textAlignVertical: 'center',
color: 'white',
fontSize: 30,
} })

运行效果如下:

 

如果需要单行

  numColumns ={3}
columnWrapperStyle={{borderWidth:2,borderColor:'black',paddingLeft:20}}
//horizontal={true}
代码去掉

文章来源:https://www.jianshu.com/p/47a2ad2bf527

FastList使用的更多相关文章

  1. 读HikariCP源码学Java(二)—— 因地制宜的改装版ArrayList:FastList

    前言 如前文所述,HikariCP为了提高性能不遗余力,其中一个比较特别的优化是它没有直接使用ArrayList,而是自己实现了FastList,因地制宜,让数组的读写性能都有了一定程度的提高. 构造 ...

  2. Linq语言性能比较

    我不只一次听到不少做技术的朋友随口一句,“linq性能是最差的”,由于缺少具体的数字比照也就没在意,但心里隐隐觉得事实应该不是这样的,我记得我第一次听到有人贬低C# 3.0是在我工作后不久的一个夏季, ...

  3. word自定义格式 并下载

    /** * * @param pRun * @param 20 间距 * @param fontSize 字体大小 * @param bold 是否加粗 * @param underLine 是否下划 ...

  4. Haxe2.10到Haxe3,NME到OpenFL的迁移备忘

    终于决定正式向Haxe3和OpenFL迁移了,这期间也遇到不少问题,这里总结记录如下: 首先是Haxe3环境 * 因为还想保留Haxe 2.10的环境,因此没有使用官网的Haxe 3安装包,而是下载了 ...

  5. HikariCP Druid比较

    HikariCP Github地址: https://github.com/brettwooldridge/HikariCP HikariCP是数据库连接池,而且是号称史上最快的, SpringBoo ...

  6. 五大理由分析Springboot 2.0为什么选择HikariCP

    五大理由分析Springboot 2.0为什么选择HikariCP 2018-05-04 工匠小猪猪 占小狼的博客 本文非原创,是工匠小猪猪的技术世界搜集了一些HikariCP相关的资料整理给大家的介 ...

  7. 005-spring boot 2.0.4-jdbc升级

    一.概述 Springboot2默认数据库连接池选择了HikariCP为何选择HikariCP理由一.代码量理由二.口碑理由三.速度理由四.稳定性理由五.可靠性HikariCP为什么这么快优化并精简字 ...

  8. JSON解析工具比较,主要GSON和FastJSON

    JSON解析工具比较,主要GSON和FastJSON 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确 ...

  9. spring boot 2.0之后默认的连接池 HIkariCP介绍

    HIkariCP链接池比之传统的Tomcat JDBC datasource .c3p0 datasource 等传统链接池优势太大,在获取链接释放链接,执行效率上面高出很多,这个产品的口号是“快速. ...

随机推荐

  1. json 字符串包含数组转换为object对象是报异常java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to

    前台传到后台的json字符串 前台实现这种格式json字符串方式: function contentFun(){ respType = respTypeFun(); return "{\&q ...

  2. react实现多行文本超出加省略号

    http://www.css88.com/archives/5206 overflow : hidden; text-overflow: ellipsis; display: -webkit-box; ...

  3. sqlzoo需要知道的那些事

    1.“Bahamas 巴哈馬”中有三個 a,還有嗎?找出所有國家,其名字包括三個或以上的a. SELECT name FROM world WHERE name LIKE '%a%a%a%' 2.“I ...

  4. [PYTHON-TSNE]可视化Word Vector

    需要的几个文件: 1.wordList.txt,即你要转化成vector的word list: spring maven junit ant swing xml jre jdk jbutton jpa ...

  5. 修改testtools框架,将测试结果显示用例注释名字

    在之前介绍的测试框架testtool中,发现测试结果中显示的都是测试用例的函数名,并没有将注释显示出来 这很不符合国人使用阿,没办法,自己动手来改改吧 首先,testtools是继承unittest的 ...

  6. node.js 简单的获取命令参数

    class Argvs { constructor() { this.argvsAll = this.argvsAll(); } argvsAll() { return process.argv.sl ...

  7. UDP协议的例子

    public class Service { // 服务器         public static void main(String[] args) {               Datagra ...

  8. JVM内存GC的骗局——JVM不抛出OOM但内存已经泄露

    概述 在日常测试中,我们会去重点观察java的内存使用情况,比如:进程会抛出OOM异常,不再接收新的请求:响应时间在固定时间段内变长,超时或者不响应,CPU使用率时常像过山车一样等.有时候JVM还会发 ...

  9. 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

    这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...

  10. 使用djiango 创建网站

    如果发现用户登录异常等情况请不要惊慌,换个浏览器就好了,谷歌有这个问题,也困扰我很久. 如果搭建过程,发现新建topic异常等现象,把不要惊慌,可能是你没有进行数据重新清理,请彻底格式化数据库就好了. ...