ListView须要指定数据的来源。传入数据必须是数组,或者是字典里面嵌套数组
系统会根据你传入的数据自动生成section和row
每个字典的key会被ListView拆分红一个section(小节,这里的section和原生的同样),若是你不指定sectionId,则key就是sectionId数组
在构造函数中指定ListView的取值策略,先new一个dataSource对象数据结构
constructor(props) { super(props); var ds =new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); }
1.getRowData(dataBlob, sectionID, rowID):代表咱们将以何种方式从dataBlob(数据源)中提取出rowData,sectionID用于指定每个section的标题名(在renderRow,renderHeader等方法中会默认拆开并做为参数传入)函数
2.getSectionHeaderData(dataBlob, sectionID):代表咱们将以何种方式从dataBlob(数据源)中提取出HeaderData。HeaderData用于给每个sectionHeader赋值this
3.rowHasChanged(prevRowData, nextRowData):指定咱们更新row的策略,通常来讲都是prevRowData和nextRowData不相等时更新rowcode
4.sectionHeaderHasChanged(prevSectionData, nextSectionData):指定咱们更新sectionHeader的策略,通常若是用到sectionData的时候才指定对象
{ sectionID_1: { rowID_1: rowData1, ... }, ... } 或者: ==**{ sectionID_1: [ rowData1, rowData2, ... ], ... }**== 或者: [ [ rowData1, rowData2, ... ], ... ] 做者:sidiWang 连接:https://www.jianshu.com/p/1293bb8ac969 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。
大多数状况下咱们会用到第二种(字典套数组)和第三种(纯数组),每个数组对应的key系统会自动提取成sectionId。而后咱们能够根据sectionId来判断所加载的section字符串
cloneWithRows(dataBlob, rowIdentities)
dataBlob是原始数据源。在没有section的时候使用此方法
,传入一个数组。rowIdentities为可选类型,为数据源的每一项指明一个id
。默认的id为字符串'0','1','2'...dataBlob.countget
cloneWithRowsAndSections(dataBlob, sectionIdentities, rowIdentities)
字典套数组的结构(有section),咱们使用下面的方法为数据源赋值。sectionIdentities和rowIdentities都是可选类型it
//1。构造函数中声明 /*第一步咱们建立了DataSource对象,提供了row更新的策略。 而后咱们在初始化state的时候,初始化一个dataSource和一个data属性 */ constructor(props) { super(props); var ds=new ListView.DataSource({rowHasChanged:(r1,r2)=>r1!=r2}) this.state={ dataSource:ds, data:["h","h","h","h","h"] } } //行方法 _renderRow(rowData,rowId) { return ( <Text>{rowData+''+rowId}</Text> ) } //listview 的使用。 /* 调用了dataSource对象提供的cloneWithRows方法给ListView的dataSource赋值, 并传入了数据源data。而后在renderRow方法中返回一个Text控件,将每一行的内容和rowId打印出来。 */ <ListView dataSource={this.state.dataSource.cloneWithRows(this.state.data)}> renderRow={(rowData,sectionId,rowId)=>this._renderRow(rowData,rowId)} </ListView>
RN会根据你传入的数据源判断是否含有section,并调用cloneWithRowsAndSections把数据源传给ListView。若是你不指定sectionId,则RN会默认按以前提到过的数据结构取出相应的sectionId和rowIdio
注意,若是使用cloneWithRowsAndSections传入数据源,必须在构造方法里面传入sectionHeaderHasChanged方法
constructor(props) { super(props); var ds=new ListView.DataSource({ rowHasChanged:(r1,r2)=>r1!=r2, sectionHeaderHasChanged:(s1,s2)=>s1!=s2 }) this.state={ dataSource:ds, data:{a:['h','m'],b:['h1','m1'],c:['h2','m2']} } } // section 是a, rowid 是0开头, rowdata是h,m _renderRow(rowData,rowId,sectionId) { return ( <Text>{rowData+''+rowId+''+sectionId}</Text> ) } <ListView dataSource={this.state.dataSource.cloneWithRowsAndSections(this.state.data)}> renderRow={(rowData,sectionId,rowId)=>this._renderRow(rowData,rowId,sectionId)} </ListView>