【React Native开发】React Native控件之ListView组件解说以及最齐全实例(19)
转载请标明出处:
http://blog.csdn.net/developer_jiangqq/article/details/50635659
本文出自:【江清清的博客】
(一)前言
【好消息】个人站点已经上线执行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org
今天我们一起来看一下ListView组件的使用详细解释以及详细事例
刚创建的React Native技术交流3群(496508742),React Native技术交流4群(458982758)。请不要反复加群!欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送!
ListView组件是React Native中一个比較核心的组件,用途很的广。该组件设计用来高效的展示垂直滚动的数据列表。最简单的API就是创建一个ListView.DataSource对象。同一时候给该对象传入一个简单的数据集合。而且使用数据源(data source)实例化一个ListView组件,定义一个renderRow回调方法(该方法的參数是一个数组)。该renderRow方法会返回一个可渲染的组件(该就是列表的每一行的item)
(二)官方ListView简单实例
以下看一个关于ListView最简单的样例:
'use strict';
import React, {
AppRegistry,
Component,
StyleSheet,
Text,
View,
ListView,
} from'react-native';
var ListViewDemo =React.createClass({
getInitialState: function() {
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
return {
dataSource: ds.cloneWithRows(['row1', 'row 2','row 3','row 4','row 5','row 6','row 7','row 8']),
};
},
render: function() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={(rowData) =><Text>{rowData}</Text>}
/>
);
}
});
AppRegistry.registerComponent('ListViewDemo',() => ListViewDemo);
实例执行效果例如以下:
(三)高级特性
ListView能够支持一些高级特性。包含设置每一组的粘性的头部(相似于iPhone)、支持设置列表的header以及footer视图、当数据列表滑动到最底部的时候支持onEndReached方法回调、设备屏幕列表可见的视图数据发生变化的时候回调onChangeVisibleRows以及一些性能方面的优化特性。
ListView设计的时候。当须要动态载入很大的数据的时候。以下有一些方法性能优化的方法能够让我妈ListView滚动的时候更加平滑:
- 仅仅更新渲染数据变化的那一行 ,rowHasChanged方法会告诉ListView组件是否须要又一次渲染当前那一行。详细能够查看ListViewDataSource实例
- 选择渲染的频率 默认情况以下每个event-loop(事件循环)仅仅会渲染一行(能够同pageSize自己定义属性设置)。
这样能够把大的工作量进行分隔,提供总体渲染的性能。
(四)基本属性方法
- ScrollView相关属性样式全部继承
- dataSource ListViewDataSource 设置ListView的数据源
- initialListSize number 进行设置ListView组件刚刚载入的时候渲染的列表行数。用这个属性确定首屏或者首页载入的数量。而不是花大量的时间渲染载入很多页面数据,提供性能哦
- onChangeVisibleRows function (visibleRows,changedRows)=>void。当可见的行发生变化的时候回调该方法。
visibleRows參数对全部可见的行为{selectionID:{rowId:true}}的形式,changedRow參数对已经改变可见的行为{selectionID:{rowID:true|false}}。该值true代表可见。false代表在视图之外不可见的行。
- onEndReachedThreshold number 当偏移量达到设置的临界值调用onEndReached
- onEndReached function 方法。当全部的数据项行被渲染之后。而且列表往下进行滚动。一直滚动到距离底部onEndReachedThredshold设置的值进行回调该方法。原生的滚动事件进行传递(通过參数的形式)。
- pageSize number 每一次事件的循环渲染的行数
- removeClippedSubviews bool 该属性用于提供大数据列表的滚动性能。该使用的时候须要给每一行(row)的布局加入over:'hidden'样式。
该属性默认是开启状态。
- renderFooter function 方法 ()=>renderable ,在每次渲染过程中头和尾总会又一次进行渲染。
假设发现该又一次绘制的性能开销比較大的时候,能够使用StaticContainer容器或者其它合适的组件。在每一次渲染过程中Footer(尾)该会一直在列表的底部,header(头)该会一直在列表的头部
- renderHeader function 方法 使用情况和上面的renderFooter差点儿相同
- renderRow function 方法 (rowData,sectionID,rowID,highlightRow)=>renderable 该方法有四个參数,当中分别为数据源中一条数据,分组的ID,行的ID,以及标记是否是高亮选中的状态信息。
- renderScrollComponent function 方法 (props)=>renderable 该方法能够返回一个能够滚动的组件。默认该会返回一个ScrollView
- renderSectionHeader function (sectionData,sectionID)=>renderable 假设设置了该方法,这样会为每个section渲染一个粘性的header视图。该视图粘性的效果是当刚刚被渲染開始的时候,该会处于相应的内容的顶部,然后開始滑动的时候。该会跑到屏幕的顶端。
直到滑动到下一个section的header(头)视图,然后被替代为止。
- renderSeparator function (sectionID,rowID,adjacentRowHighlighted)=>renderable 假设设置该方法。会在被每一行的以下渲染一个组件作为分隔。
除了每个section分组的头部视图前面的最后一行。
- scrollRenderAheadDistance number 进行设置当该行进入屏幕多少像素以内之后就開始渲染该行
(五)使用实例
5.1.首先看一个相对简单的实例,列表每一行显示一个图片以及文字,详细代码例如以下:
'use strict';
import React, {
AppRegistry,
Component,
StyleSheet,
Text,
View,
ListView,
Image,
TouchableOpacity,
} from'react-native';
var THUMB_URLS = [
require('./imgs/like.png'),
require('./imgs/dislike.png'),
require('./imgs/call.png'),
require('./imgs/fist.png'),
require('./imgs/bandaged.png'),
require('./imgs/flowers.png'),
require('./imgs/heart.png'),
require('./imgs/liking.png'),
require('./imgs/party.png'),
require('./imgs/poke.png'),
require('./imgs/superlike.png'),
require('./imgs/victory.png'),
];
var ListViewDemo =React.createClass({
getInitialState: function() {
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
return {
dataSource: ds.cloneWithRows(['row1', 'row 2','row 3','row 4','row 5','row 6','row 7','row 8','row 9','row10','row 11','row 12']),
};
},
_renderRow: function(rowData: string,sectionID: number, rowID: number) {
var imgSource = THUMB_URLS[rowID];
return (
<TouchableOpacity>
<View>
<View style={styles.row}>
<Image style={styles.thumb} source={imgSource} />
<Text style={{flex:1,fontSize:16,color:'blue'}}>
{rowData + '我是測试行号哦~'}
</Text>
</View>
</View>
</TouchableOpacity>
);
},
render: function() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
/>
);
}
});
var styles =StyleSheet.create({
row: {
flexDirection: 'row',
justifyContent: 'center',
padding: 10,
backgroundColor: '#F6F6F6',
},
thumb: {
width: 50,
height: 50,
},
});
AppRegistry.registerComponent('ListViewDemo',() => ListViewDemo);
执行效果例如以下:
5.2.实例实现表格布局,代码例如以下:
'use strict';
var React =require('react-native');
var {
AppRegistry,
Image,
ListView,
TouchableHighlight,
StyleSheet,
Text,
View,
} = React; var THUMB_URLS = [
require('./imgs/like.png'),
require('./imgs/dislike.png'),
require('./imgs/call.png'),
require('./imgs/fist.png'),
require('./imgs/bandaged.png'),
require('./imgs/flowers.png'),
require('./imgs/heart.png'),
require('./imgs/liking.png'),
require('./imgs/party.png'),
require('./imgs/poke.png'),
require('./imgs/superlike.png'),
require('./imgs/victory.png'),
require('./imgs/logo.png'),
]; var ListViewDemo =React.createClass({
getInitialState: function() {
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
return {
dataSource:ds.cloneWithRows(this._genRows({})),
};
},
_pressData: ({}: {[key: number]: boolean}),
componentWillMount: function() {
this._pressData = {};
},
render: function() {
return (
<ListView
initialListSize={12}
contentContainerStyle={styles.list}
dataSource={this.state.dataSource}
renderRow={this._renderRow}
/>
);
},
_renderRow: function(rowData: string,sectionID: number, rowID: number) {
var imgSource = THUMB_URLS[rowID];
return (
<TouchableHighlight underlayColor="red">
<View>
<View style={styles.row}>
<Image style={styles.thumb} source={imgSource} />
<Text style={styles.text}>
{rowData}
</Text>
</View>
</View>
</TouchableHighlight>
);
},
_genRows: function(pressData: {[key: number]:boolean}): Array<string> {
var dataBlob = [];
for (var ii = 0; ii < THUMB_URLS.length;ii++) {
dataBlob.push('单元格 ' + ii);
}
return dataBlob;
},
});
var styles =StyleSheet.create({
list: {
marginTop:5,
justifyContent: 'space-around',
flexDirection: 'row',
flexWrap: 'wrap'
},
row: {
justifyContent: 'center',
padding: 5,
margin: 3,
width: 85,
height: 85,
backgroundColor: '#F6F6F6',
alignItems: 'center',
borderWidth: 1,
borderRadius: 5,
borderColor: '#CCC'
},
thumb: {
width: 45,
height: 45
},
text: {
flex: 1,
marginTop: 5,
fontWeight: 'bold'
},
});
AppRegistry.registerComponent('ListViewDemo',() => ListViewDemo);
执行效果例如以下:
(六)最后总结
今天我们主要学习一下ListView组件的谅解以及相关实例演示。大家有问题能够加一下群React Native技术交流群(282693535)或者底下进行回复一下。
尊重原创,转载请注明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵权必究!
关注我的订阅号(codedev123),每天分享移动开发技术(Android/IOS),项目管理以及博客文章!(欢迎关注,第一时间推送精彩文章)
关注我的微博。能够获得很多其它精彩内容

【React Native开发】React Native控件之ListView组件解说以及最齐全实例(19)的更多相关文章
- 【React Native开发】React Native控件之Image组件解说与美团首页顶部效果实例(10)
),React Native技术交流4群(458982758),欢迎各位大牛,React Native技术爱好者增加交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! Im ...
- WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用 转自:http://www.cnblogs.com/wuhuacong/arch ...
- Android开发之日历控件实现
Android开发之日历控件实现:以下都是转载的. 日历控件 日历控件 日历控件 日历控件
- Qt 开发 MS VC 控件终极篇
Qt 开发 MS VC 控件终极篇 1. 使用 MSVC2015 通过项目向导创建 Qt ActiveQt Server 解决方案 项目配置:以下文件需要修改 1. 项目属性页->项目属性-&g ...
- Android开发:文本控件详解——TextView(一)基本属性
一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...
- python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐(二)
在上一篇blog:python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 中介绍了python中的tkinter的一些东西,你可能对tkinter有一定的了解了.这篇b ...
- RS开发日期提示控件默认为昨天之进阶篇
时隔<RS开发日期提示控件默认为昨天>这篇博文已经很久了,请原谅我隔了这么久才继续来写这篇笔记.也希望读到这篇笔记的朋友可以从这篇笔记中学习到一些关于RS日期控件和JS的一些应用知识,当然 ...
- Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全
原文:Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全 前面简单学习了一些Android UI的一些基础知识,那么接下来我们一起来详细学习Android的 ...
- Android开发:文本控件详解——TextView(二)文字跑马灯效果实现
一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...
随机推荐
- mysql-5.7.10产生的日志时间与系统时间不一致
问题描述: 使用安装的mysql workbench登录mysql后,选择server log 进行日志查看的时候,发现产生日志的时间和当期的系统时间不一致:如下图: 查看mysql系统的当期时间显示 ...
- 读书笔记_Effective_C++_条款三十九:明智而审慎地使用private继承
private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡 ...
- PHP self与static区别
this,static和self. self和this还是很好区分的,可是self和static就很糊涂了,两者都能调用静态的方法和属性,看似使用上没有什么太大的分别,但是实际上分别很大,先来看下面这 ...
- 小程序navigator点击有时候会闪一下
<navigator hover-class="none">
- 主动找智能钥匙 PKE取代RKE是大势所趋
http://taobao.autos.cn.yahoo.com/ypen/20111128/725214.html 近日,在车友论坛上的一个热帖<悲喜交加:1分钟就能复制汽车遥控器?>在 ...
- 向USB设备发送SCSI命令
http://bbs3.driverdevelop.com/simple/?t84347.html { BOOL status = ; DWORD accessMode = , shareMode = ...
- golang 实现轻量web框架
经常看到很多同学在打算使用go做开发的时候会问用什么http框架比较好.其实go的 http package 非常强大,对于一般的 http rest api 开发,完全可以不用框架就可以实现想要的功 ...
- 盘点Linux内核源码中使用宏定义的若干技巧(1)
http://blog.chinaunix.net/uid-23769728-id-3141515.html
- HTTP的KeepAlive是开启还是关闭?
HTTP的KeepAlive是开启还是关闭? http://itindex.net/detail/50719-http-keepalive 1.KeepAlive的概念与优势 HTTP的KeepAli ...
- 引子——从Mac OS X的Lion说起
最近感悟越来愈多,女儿越来越大,头发越来越少,我知道,自己老了. 30岁之后,时间仿佛开闸的河水一样滚滚而去,感觉自己浪费的时间太多.我们不得不承认,先知先觉的人会比我们领先10年甚至更多的身位.所以 ...