reactnative ListView

1.简单的ListView (点击、长按删除cell)

ListView组件必须的两个属性是dataSource和renderRow。dataSource是列表的数据源,而renderRow则逐个解析数据源中的数据,然后返回一个设定好格式的组件来渲染。

constructor(params)
你可以在构造函数中针对section标题和行数据提供自定义的提取方法和hasChanged
比对方法。如果不提供,则会使用默认的defaultGetRowData
和defaultGetSectionHeaderData
方法来提取行数据和section标题。
默认的提取函数可以处理下列形式的数据:
{ sectionID_1: { rowID_1: rowData1, ... }, ... }
或者:
{ sectionID_1: [ rowData1, rowData2, ... ], ... }
或者:
[ [ rowData1, rowData2, ... ], ... ]

构造函数可以接受下列四种参数(都是可选):
getRowData(dataBlob, sectionID, rowID);
getSectionHeaderData(dataBlob, sectionID);
rowHasChanged(prevRowData, nextRowData);
sectionHeaderHasChanged(prevSectionData, nextSectionData);

state是一个状态 这里设置了一个状态dataSource,他的值就是ds.cloneWithRows(['row 1', 'row 2']),然后在ListView组件中使用了这个状态dataSource={this.state.dataSource}。这样就是将数据源交给了ListView。

  constructor(props){
    super(props);
    this.state = {
      dataSource : new ListView.DataSource({rowHasChanged:(r1,r2)=> r1 !== r2}).cloneWithRows(data)
    };
}
<1> 抽出ListView模块
 _randerContent(){
    return(
        <View style = {styles.container}>
            <ListView style = {{flex:1}}
            dataSource  = {this.state.dataSource}
            renderRow = {(rowData,sectionIds,rowIds)=> this._renderRowCell(rowData,sectionIds,rowIds)}
            />
        </View>
    )
}
render() {
  return(
      //抽出ListView
      this._randerContent()
  )
};
<2> cell 模块
_renderRowCell(rowData,sectionIds,rowIds){
    console.log(rowIds);
    return(
    <TouchableHighlight onPress ={()=> this._didSelect(rowIds)} onLongPress = {()=>this._deleteRow(rowIds)} >
        <View style = {styles.viewStyle}>
            <Text style = {styles.textStyle}>{rowData}</Text>
        </View>
    </TouchableHighlight>
    );
}
<3> 单击 长按删除模块
 _didSelect(rowid){
    alert('点击了'+rowid);
}
_deleteRow(rowid){
    delete data[rowid];
    this.setState({
    dataSource: this.state.dataSource.cloneWithRows(data)
    })
}

_deleteRow 删除 对应row下标数据data 然后重新改变状态 会重新渲染视图

RNListView.gif
2.带组视图ListView
<1> 构造函数
constructor(props){
    super(props);
    this.state = {
        data : new ListView.DataSource({rowHasChanged:(r1,r2)=>r1 !== r2,
            sectionHeaderHasChanged:(s1,s2)=>s1 !== s2,
        }),
    }
}

rowHasChanged函数也是ListView的必需属性。
sectionHeaderHasChanged 带组视图属性

<2>数据处理
componentDidMount(){
    
  let length = arr.length;
  let dataBlob = {};
  let rowIds = [];
  let sectionIds = [];

  for (let i =0 ;i < length;i ++){
     let dic = arr[i];
     sectionIds.push(dic.sId);
     dataBlob[dic.sId] = dic.title;

     let userLenght = dic.users.length;

     let users = dic.users;
      rowIds[i] = [];
     for (let j =0;j < userLenght;j++){

         let user = users[j];
         rowIds[i].push(user.rid);
         dataBlob[dic.sId + ':' + user.rid] = user;

     }
  }

    this.setState({
        data : this.state.data.cloneWithRowsAndSections(dataBlob,sectionIds,rowIds)
    })
}

rowIds是一个二维数组,包含了行数据对应的id标识符,例如[['a1', 'a2'], ['b1', 'b2', 'b3'], ...]。如果没有指定此数组,则默认取行数据的key。
sectionIds同理是包含了section标识符的数组。例如['s1', 's2', ...]。如果没有指定此数组,则默认取section的key。
根据指定的dataBlob和 rowIds为ListViewDataSource复制填充数据。dataBlob即原始数据。需要在初始化时定义抽取函数(否则使用默认的抽取函数)
其中 dataBlob 数据key 是[row:section] Value 是 每一个row 对应的对象 如: dataBlob[dic.sId + ':' + user.rid] = user;

<3>ListView显示
<View>
      <ListView
          dataSource = {this.state.data}
          renderRow = {this._renderContent}
          renderSectionHeader = {this.renderSectionHeader}
      />
</View>

renderSectionHeader 每个小节(section)渲染一个粘性的标题。
粘性是指当它刚出现时,会处在对应小节的内容顶部;继续下滑当它到达屏幕顶端的时候,它会停留在屏幕顶端,一直到对应的位置被下一个小节的标题占据为止。可以使用 stickySectionHeadersEnabled来决定是否启用其粘性特性。
stickyHeaderIndices
一个子视图下标的数组,用于决定哪些成员会在滚动之后固定在屏幕顶端。举个例子,传递stickyHeaderIndices={[0]}
会让第一个成员固定在滚动视图顶端。这个属性不能和horizontal={true}一起使用。

分组ListView
3.Grid layout ListView
<1>ListView显示
<ListView
     initialListSize={12}
     dataSource  = {this.state.dataSource}
    renderRow = {(rowData,sectionid,rowId)=> this._renderRowCell(rowData,sectionid,rowId)}
    contentContainerStyle={styles.listviewStyle}
/>

其中 ListView的样式必须是 contentContainerStyle 而不是style

<2>ListView、Cell样式
listviewStyle:{
    marginTop:5,
    justifyContent: 'space-around',
    flexDirection: 'row',
    flexWrap: 'wrap'
},
textStyle:{
    color:'#999',
    fontSize:15,
    margin:5,
},
viewStyle:{
    backgroundColor:'white',
    borderColor:'#d5d5d5',
    borderWidth:1,
    height:itemWdith,
    width:itemWdith,
    padding: 5,
    margin: 5,
    justifyContent:'center',
    alignItems:'center',
}
grid Layout ListView

demo下载地址
参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容