React-Native之ListView的3種樣式

最近在學(xué)習(xí)React-Native的ListView組件,其實ListView 相當(dāng)于iOS中的tableview,當(dāng)然也可以通過改變布局來實現(xiàn)collectionView的樣式辈毯,和分組的tableview樣式,下面先看效果圖钝凶。


ss.gif
1唁影,基本ListView布局
第一種ListView布局應(yīng)該是最簡單了耕陷,沒有分組据沈,只要知道ListView的創(chuàng)建方法,和如何設(shè)置  
ListView的數(shù)據(jù)源就行了锌介。

import React, { Component } from 'react';
import {    
    AppRegistry,    
    StyleSheet,    
    Text,    
    View,    
    ListView,    
  Image} from 'react-native';
var Dimensions = require('Dimensions');//獲取屏幕的寬高
var ScreenWidth = Dimensions.get('window').width;
var ScreenHeight = Dimensions.get('window').height;
var FirstView = React.createClass({    
      getInitialState(){        
      var ds = new ListView.DataSource({rowHasChanged:(r1,r2) => r1 !== r2});   
      return{            
          dataSource:ds.cloneWithRows(this.getRows({}))//初始化數(shù)據(jù)源    
      }  
  },    
//制作假數(shù)據(jù)    
  getRows(){        
        var dataArr = [];        
        for (var i = 0; i<100; i++){            
              dataArr.push({                    
                    title: 'Row' + i,                    
                    text:'Lorem ipsum dolor sit amet, ius ad pertinax oportere 
                    accommodare, an vix civibus corrumpit referrentur. Te nam case ludus 
                    inciderint, te mea facilisi adipiscing. Sea id integre luptatum. In tota sale 
                    consequuntur nec. Erat ocurreret mei ei. Eu paulo sapientem vulputate
                   est, vel an accusam intellegam interesset. Nam eu stet pericula
                    reprimique, ea vim illud modus, putant invidunt reprehendunt ne qui' + i
                        }            )        }       
           return dataArr;   
       },   
  render(){       
       return( 
//    創(chuàng)建ListView組件      
              <ListView              
                     dataSource={this.state.dataSource}//設(shè)置數(shù)據(jù)源               
                      renderRow={this.renderRow}//返回cell          
             />        )    }, 
//返回cell的方法   
  renderRow(rowData,sectionID,rowID,highlightRow){       
             return(            
                  <View  style={styles.rightViewStyle}>                
                        <Image style={styles.imageStyle}/>                
                        <View>                   
                             <Text style={styles.titleStyle}>{rowData.title}</Text> 
                             <Text style={styles.textStyle}>{rowData.text}</Text> 
                       </View>      
                  </View>        )    }})
//樣式
  const styles = StyleSheet.create({    
          tabStyle:{        
              flex:1    
          },    
          rightViewStyle:{        
                flexDirection:'row',        
                borderBottomColor:'#CCCCCC',//cell的分割線       
                borderBottomWidth:1    
          },    
          imageStyle:{        
                      width:80,        
                      height:80,        
                      margin:20,        
                      backgroundColor:'red'    
          },    
           titleStyle:{        
                marginTop:20,        
                backgroundColor:'yellow'    
          },    
          textStyle:{        
                width:ScreenWidth-140,        
                backgroundColor:'green',        
                marginBottom:20    
        }});
module.exports = FirstView;
2孔祸,類似collectionView的布局
改變ListView的主軸方向,讓ListView橫向布局拂蝎,然后設(shè)置換行顯示,就能實現(xiàn)類似
collectionView的布局了
import React, { Component } from 'react';
import {    
    AppRegistry,    
    StyleSheet,    
    Text,    
    View,    
    ListView,    Image} from 'react-native';

var Dimensions = require('Dimensions');//獲取屏幕的寬高
var ScreenWidth = Dimensions.get('window').width;
var ScreenHeight = Dimensions.get('window').height;

var SecondView = React.createClass({    
      getInitialState(){        
          //初始化數(shù)據(jù)源
          var ds = new  ListView.DataSource({rowHasChanged:(r1,r2) => r1 !== r2});
          return{            
               dataSource : ds.cloneWithRows(this.getRows({}))         
          }    
      },    
      //制作假數(shù)據(jù) 
      getRows(){        
            var Arr = [];        
            for(var i = 0; i<100; i++){           
                   Arr.push(
                       {                   
                         image: '111',                   
                         price:'222'                
                      }            )        
              }        
        return Arr;    
      },    
      render(){        
          return(            
                <ListView     //創(chuàng)建ListView           
                      dataSource={this.state.dataSource} //設(shè)置數(shù)據(jù)源               
                      renderRow={this.renderRow} //設(shè)置cell               
                      contentContainerStyle={styles.listViewStyle}//設(shè)置cell的樣式
              />)    
        }, 
  //返回cell的方法   
    renderRow(rowData,sectionID,rowID,highlightRow){            
        return(                
            <View style={styles.bgStyle}>                    
                <Image style={styles.imageStyle}/>                    
                <Text style={{fontSize:20,marginBottom:0}}>{rowData.price}</Text>
            </View>            )    }})
//樣式
const styles = StyleSheet.create({    
        listViewStyle:{        
              flexDirection:'row', //設(shè)置橫向布局       
              flexWrap:'wrap'    //設(shè)置換行顯示
        },    
        bgStyle:{        
              backgroundColor:'gray',        
              width:(ScreenWidth-30)/2, //cell的寬度        
              height:250,        
              marginLeft:10,        
              marginTop:10    
        },    
        imageStyle:{        
              width:(ScreenWidth-30)/2,       
              height:230,        
              backgroundColor:'red',        
              marginBottom:0,    
      }
});
module.exports = SecondView;    
3,分組ListView的布局
5540CDF6-A572-4B35-A0DC-F827A31DBF59.png
因為是分組的ListView,顯然設(shè)置數(shù)據(jù)源的方法就應(yīng)該用cloneWithRowsAndSections

import React, { Component } from 'react';
import {    
    AppRegistry,    
    StyleSheet,    
    Text,    
    View,    
    ListView,    
    Image} from 'react-native';

如果不提供針對section標(biāo)題和行數(shù)據(jù)提供自定義的提取方法拇涤,就會使用默認的方法,


98293E7A-C6BB-4D20-9E05-53BB2EE8A6C9.png
var ThirdView = React.createClass({    
      getInitialState(){        
          var getSectionData = (dataBlob,sectionID)=>{            
                return dataBlob[sectionID];        
          };        
          var getRowData = (dataBlob,sectionID,rowID) =>{            
                  return dataBlob[sectionID + ':' + rowID];        
          };
          因為這里我們需要返回區(qū)的數(shù)據(jù)券躁,所以我們需要提供方法來提取行數(shù)據(jù)和section標(biāo)題        
          return{            
              dataSource:new ListView.DataSource({                                     
              getSectionData:getSectionData,                
              getRowData:getRowData,                
              rowHasChanged:(r1,r2)=> r1 !==r2,                
              sectionHeaderHasChanged:(s1,s2)=> s1!== s2            })        }    
},   
F2E6FFB0-D204-4F5E-8BB6-AB3C6BE0EBA9.png
//從上面的圖片我們可以看出提取函數(shù)處理的數(shù)據(jù)的形式掉盅,其實就是個二維數(shù)組,
//制作假數(shù)據(jù)        
getLocaData(){
      var  Arr = {},            
      sectionIDs =[],//所有區(qū)ID的數(shù)組            
      rowIDs =[];//行ID數(shù)組
       //通過兩次for循環(huán)創(chuàng)建假數(shù)據(jù)      
      for (var i = 0; i< 10; i++){           
           sectionIDs.push(i);            
           Arr[i] = 'section' + i;            
           rowIDs[i] = [];            
          for (var j= 0; j<5; j++){                
                rowIDs[i].push(j);                
                Arr[i +':' +j] = 'section' + i + '--row' + j;           
           }       
       } 
    //重新設(shè)置ListView的數(shù)據(jù)源趾痘,刷新表       
    this.setState({      
       dataSource:this.state.dataSource.cloneWithRowsAndSections(Arr,sectionIDs,rowIDs)            
  })    
},    
render(){        
      return(            
            <ListView//創(chuàng)建表,并設(shè)置返回section和cell的方法                
                    dataSource={this.state.dataSource}                
                    renderRow={this.renderRow}                
                    renderSectionHeader={this.renderSectionHeader}                                
                    contentContainerStyle={styles.listViewStyle}            />        )    
},    
//這個方法相當(dāng)于iOS的viewDidload方法卵贱,通常用于網(wǎng)絡(luò)請求滥沫,返回數(shù)據(jù)之后重新刷新表,這里讓它調(diào)用制作假數(shù)據(jù)的方法键俱,然后刷新表    
componentDidMount(){         
    this.getLocaData();    
},  
//返回cell的方法  
renderRow(rowData,sectionID,rowID,highlighRow){        
      return(            
              <View style={styles.cellStyle}>                
                  <Image style={styles.imageStyle}/>                
                  <Text>{rowData}</Text>            
              </View>        )    
}, 
//返回section的方法  
renderSectionHeader(sectionData,sectionID){        
      return(            
            <View style={styles.sectionStyle}>                
                <Text>{sectionData}</Text>            
           </View>        )    },})
//樣式
const styles = StyleSheet.create({    
          sectionStyle:{        
                backgroundColor:'gray',        
                height:25    
          },    
        cellStyle:{        
              flexDirection:'row', //設(shè)置橫向布局       
              borderBottomColor:'#CCCCCC',        
              borderBottomWidth:1,        
              alignItems:'center'//交叉軸的對齊方式    
         },    
        imageStyle:{        
              width:70,        
              height:70,        
              backgroundColor:'red',        
              margin:20    
        },
});
module.exports = ThirdView;

最后的樣子就是下面的圖片,主要要理解ListView的數(shù)據(jù)源的結(jié)構(gòu)缀辩,通過構(gòu)造假數(shù)據(jù)可以更好的理解如何給ListView設(shè)置數(shù)據(jù)源


2FA7116E-088F-4A51-9F1B-0AF3CDCF5FC4.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踪央,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子畅蹂,更是在濱河造成了極大的恐慌,老刑警劉巖魁莉,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旗唁,居然都是意外死亡,警方通過查閱死者的電腦和手機检疫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺溢,“玉大人,你說我怎么就攤上這事风响。” “怎么了状勤?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵双泪,是天一觀的道長持搜。 經(jīng)常有香客問我焙矛,道長,這世上最難降的妖魔是什么村斟? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任抛猫,我火速辦了婚禮,結(jié)果婚禮上邑滨,老公的妹妹穿的比我還像新娘日缨。我一直安慰自己,他們只是感情好匣距,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尚卫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吱涉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天怎爵,我揣著相機與錄音盅蝗,去河邊找鬼鳖链。 笑死墩莫,一個胖子當(dāng)著我的面吹牛芙委,可吹牛的內(nèi)容都是我干的狂秦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼裂问,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了愕秫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤符喝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后协饲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畏腕,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡茉稠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了而线。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘹狞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磅网,到底是詐尸還是另有隱情,我是刑警寧澤涧偷,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布毙死,位于F島的核電站燎潮,受9級特大地震影響规哲,放射性物質(zhì)發(fā)生泄漏跟啤。R本人自食惡果不足惜唉锌,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袄简。 院中可真熱鬧,春花似錦绿语、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匹耕。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驶赏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工盖文, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人五续。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蒋失,于是被迫代替她去往敵國和親桐玻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 學(xué)習(xí)本系列內(nèi)容需要具備一定 HTML 開發(fā)基礎(chǔ)铣卡,沒有基礎(chǔ)的朋友可以先轉(zhuǎn)至 HTML快速入門(一) 學(xué)習(xí) 本人...
    珍此良辰閱讀 13,329評論 11 24
  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子煮落,類似...
    liudhkk閱讀 9,006評論 3 38
  • 此文章中踊谋,包括簡單的布局蝉仇,九宮格布局和頭視圖的使用小demo 前言 在iOS開發(fā)中殖蚕,用的最多的一個控件就是Tabl...
    Zax_Smile閱讀 4,112評論 15 22
  • { 24、Sqlite數(shù)據(jù)庫 1睦疫、存儲大數(shù)據(jù)量害驹,增刪改查蛤育,常見管理系統(tǒng):Oracle、MSSQLServer瓦糕、DB...
    CYC666閱讀 929評論 0 1
  • 這節(jié)課的內(nèi)容是關(guān)于一篇非常著名的論文《知識在社會中的運用》,作者是1974年諾獎得主哈耶克咕娄。該論文與1945年發(fā)表...
    AmberShao閱讀 4,098評論 1 7