React Native的組件ListView


React Native的組件ListView類似於iOS中的UITableView和UICollectionView,也就是說React Native的組件ListView既可以實現UITableView也可以實現UICollectionView。

ListView的使用方法:

1.首先創建一個ListView.DataSource數據源,然后向他傳遞一個普通的數據源數組。

2.使用該數據源實例化一個ListView組件,定義一個renderRow回調函數,這個函數會接收數組中的每個數據作為參數,並返回一個可以渲染的組件部分。這個組件部分就是ListView的每一行。

  //設置初始值
getInitialState(){
//設置數據源
var ds = new ListView.DataSource({rowHasChanged:(r1,r2) => r1 !== r2}); //當且僅當cell中的任意兩行不相等時才重新渲染
//設置返回數據
return{
dataSource:ds.cloneWithRows(Wine)
}
},
render(){
return(
<ListView
dataSource={this.state.dataSource} //數據源
renderRow={this.renderRow} //返回具體的cell,有四個參數 => 1:一條信息 2:分組ID 3:行ID 4:標記是否高亮選中的狀態信息.不帶()表示參數自傳遞
/>
);
},

  演示代碼如下:

/**
* Sample React Native App
* https://github.com/facebook/react-native
* 周少停 listView
* 2016-09-21
*/

import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Image,
ListView
} from 'react-native';
//導入json數據
var Wine = require('./WineJson.json'); //json數組

var Project = React.createClass({
//設置初始值
getInitialState(){
//設置數據源
var ds = new ListView.DataSource({rowHasChanged:(r1,r2) => r1 !== r2}); //當且僅當cell中的任意兩行不相等時才重新渲染
//設置返回數據
return{
dataSource:ds.cloneWithRows(Wine)
}
},
render(){
return(
<ListView
dataSource={this.state.dataSource} //數據源
renderRow={this.renderRow} //返回具體的cell,有四個參數 => 1:一條信息 2:分組ID 3:行ID 4:標記是否高亮選中的狀態信息.不帶()表示參數自傳遞
/>
);
},
//返回具體的cell
renderRow(rowData,sectionID,rowID,highlightRow){
return(
<View style={styles.cellViewStyle}>
{/*左邊的圖片*/}
<Image source={{uri:rowData.image}} style={styles.leftImageStyle} />
{/*右邊的View*/}
<View style={styles.rightViewStyle}>
<Text style={styles.nameTextStyle}>{rowData.name}</Text>
<Text style={styles.montyTextStyle}>${rowData.money}</Text>
</View>
</View>
);
}

});

const styles = StyleSheet.create({
cellViewStyle:{
flexDirection:'row',//主軸方向
borderBottomWidth:1,
borderBottomColor:'cyan'
},
leftImageStyle:{
width:60,
height:60
},
rightViewStyle:{

},
nameTextStyle:{

},
montyTextStyle:{
color:'red',
//距底部2
position:'absolute',
bottom:2
}
});

AppRegistry.registerComponent('Project', () => Project);

涉及到的json數據如下:

[
    {
        "image":"1.png",
        "money":"319",
        "name":"酒名1"
    },
    {
        "image":"2.png",
        "money":"339",
        "name":"酒名2酒名2酒名2酒名22酒名2酒名酒名2"
    },
    {
        "image":"3.png",
        "money":"319",
        "name":"酒名4"
    },
    {
        "image":"4.png",
        "money":"29",
        "name":"酒名4"
    },
    {
        "image":"5.png",
        "money":"55",
        "name":"酒名5"
    },
    {
        "image":"6.png",
        "money":"67",
        "name":"酒名6"
    },
    {
        "image":"7.png",
        "money":"37",
        "name":"酒名7"
    },
    {
        "image":"8.png",
        "money":"33",
        "name":"酒名8"
    },
    {
        "image":"9.png",
        "money":"35",
        "name":"酒名9"
    },
    {
        "image":"10.png",
        "money":"22",
        "name":"酒名10"
    },
    {
        "image":"11.png",
        "money":"19",
        "name":"酒名11"
    },
    {
        "image":"12.png",
        "money":"392",
        "name":"酒名12"
    },
    {
        "image":"13.png",
        "money":"339",
        "name":"酒名13"
    },
    {
        "image":"14.png",
        "money":"439",
        "name":"酒名14"
    },
    {
        "image":"15.png",
        "money":"359",
        "name":"酒名15"
    },
    {
        "image":"16.png",
        "money":"369",
        "name":"酒名16"
    },
    {
        "image":"17.png",
        "money":"7397",
        "name":"酒名17"
    },
    {
        "image":"18.png",
        "money":"7397",
        "name":"酒名18"
    },
    {
        "image":"19.png",
        "money":"7397",
        "name":"酒名19"
    },
    {
        "image":"20.png",
        "money":"7207",
        "name":"酒名20"
    },
    {
        "image":"21.png",
        "money":"7397",
        "name":"酒名21"
    }
]

效果如下:

九宮格演示:

代碼:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * 周少停 ListView1
 * 2016-09-21
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
    Image,
  ListView,
    AlertIOS,
  TouchableOpacity
} from 'react-native';
//導入json
var shareData= require('./shareJson.json');
//Dimentsions
var Dimensions = require('Dimensions');
var screenWidth = Dimensions.get('window').width;
//一些常量設置
var cols = 3; //一行幾個cell
var cellWH = 100; //cell的寬高
var vMargin = (screenWidth - cellWH * cols)/ (cols + 1); //cell之間的邊距
var hMargin = 20;

var Project = React.createClass({
  //設置默認值(不可修改)
  getDefaultProps(){
    return{

    }
  },
  //設置初始值(可以修改)
  getInitialState(){
    var ds = new ListView.DataSource({rowHasChanged:(r1,r2)=> r1 !== r2});
    return{
        dataSource : ds.cloneWithRows(shareData.data)
    }
  },
  render(){
    return(
        <ListView
            dataSource={this.state.dataSource}
            renderRow={this.renderRow}
            contentContainerStyle={styles.listViewStyle}
        />
    );
  },
  //單獨的cell
  renderRow(rowData){
    return(
      <TouchableOpacity activeOpacity={0.5} onPress={()=>{this.cellOnclick()}}>
        <View style={styles.innerViewStyle}>
          <Image source={{uri:rowData.icon}} style={styles.iconStyle}/>
          <Text>{rowData.title}</Text>
        </View>
      </TouchableOpacity>
    );
  },
  cellOnclick(){
    AlertIOS.alert("點擊了cell")
  }
});

const styles = StyleSheet.create({
  listViewStyle:{
      //改變主軸方向
    flexDirection:'row',
    //多行顯示
    flexWrap:'wrap'
  },
  innerViewStyle:{
    width:cellWH,
    height:cellWH,
    marginLeft:vMargin,
    marginTop:hMargin,
    alignItems:'center'
  },
  iconStyle :{
    width:80,
    height:80
  }
});

AppRegistry.registerComponent('Project', () => Project);

  涉及到的json:

{
  "data":[
  {
    "icon":"icon1",
    "title":"分享1"
  },
  {
    "icon":"icon2",
    "title":"分享2"
  },
  {
    "icon":"icon3",
    "title":"分享3"
  },
  {
    "icon":"icon4",
    "title":"分享5"
  },
  {
    "icon":"icon5",
    "title":"分享5"
  },
  {
    "icon":"icon6",
    "title":"分享6"
  },
  {
    "icon":"icon7",
    "title":"分享7"
  },
  {
    "icon":"icon8",
    "title":"分享8"
  },
  {
    "icon":"icon9",
    "title":"分享9"
  },
  {
    "icon":"icon10",
    "title":"分享10"
  }
  ]
  }

  效果如下:

帶有表頭的listView:

代碼:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * 周少停 ListView
 * 帶有分組的ListView 使用cloneWithRowsAndSections設置數據源,三個參數:sectionIDs,rowIDs,dataBlob
 * 2016-09-22
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Image,
  ListView,
  TouchableOpacity
} from 'react-native';
//導入外部的json數據
var Car = require('./Car.json');

var Project = React.createClass({
    //初始化函數 在這里准備數據源
    getInitialState(){
        var sectionData = (dataBlob,sectionID) => {
            return dataBlob[sectionID];
        };
        var rowData = (dataBlob,sectionID,rowID) => {
            return dataBlob[sectionID + ':' + rowID];
        };
        return{
            dataSource:new ListView.DataSource({
                getSectionData:sectionData,
                getRowData:rowData,
                rowHasChanged:(r1,r2) => r1 !== r2,
                sectionHeaderHasChanged:(s1,s2) => s1 !== s2
            })
      }
    },
    render() {
        return (
            <ListView
                dataSource={this.state.dataSource}
                renderRow={this.renderRow}
                renderSectionHeader={this.renderSectionHeader}
            />
        );
    },
    //每一行數據
    renderRow(rowData){
      return(
         <TouchableOpacity activeOpacity={0.5}>
            <View style={styles.rowStyle}>
                <Image source={{uri:rowData.icon}} style={styles.rowImageStyle}/>
                <Text style={{marginLeft: 5}}>{rowData.name}</Text>
            </View>
         </TouchableOpacity>
      );
    },
    //組數據
    renderSectionHeader(sectionData,sectionID){
        return(
            <View style={styles.sectionHeaderStyle}>
                <Text style={{color: 'red',marginLeft:5}}>{sectionData}</Text>
            </View>
        );
    },
    //做一些復雜的操作:數據請求
    componentDidMount() {
        this.loadDataFormJson();
    },
    loadDataFormJson(){
        //先取到data數據
        var jsonData = Car.data;
        //定義一些變量數組用來存值
        var dataBlob = {},sectionIDs = [],rowIDs = [],cars = [];
        //遍歷
        for(var i = 0;i<jsonData.length;i++){
           //把組號放入sectionIDs數組中
            sectionIDs.push(i);
            //把組中內容放入dataBlob對象中
            dataBlob[i] = jsonData[i].title;
            //把組中的每行數據的數組放入cars
            cars = jsonData[i].cars;
            //先確定rowIDs的第一維
            rowIDs[i] = [];
            //遍歷cars數組,確定rowIDs的第二維
            for(var j = 0;j<cars.length;j++){
                rowIDs[i].push(j);
                //把每一行中的內容放入dataBlob對象中
                dataBlob[i+':'+j] = cars[j];
            }
        }
        this.setState({
           dataSource:this.state.dataSource.cloneWithRowsAndSections(dataBlob,sectionIDs,rowIDs)
        });
    }
});

const styles = StyleSheet.create({
    rowImageStyle:{
            width:70,
            height:70
    },
    rowStyle:{
        flexDirection:'row',
        alignItems:'center',
        padding:10,
        borderBottomColor:'#e8e8e8',
        borderBottomWidth:0.5
    },
    sectionHeaderStyle:{
        backgroundColor:'#e8e8e8',
        height:25,
        justifyContent:'center'
    }
});

AppRegistry.registerComponent('Project', () => Project);

  涉及到的json:

{
  "data": [
    {
      "cars": [
        {
          "icon": "m_180_100.png",
          "name": "AC Schnitzer"
        },
        {
          "icon": "m_92_100.png",
          "name": "阿爾法·羅密歐"
        },
        {
          "icon": "m_9_100.png",
          "name": "奧迪"
        },
        {
          "icon": "m_97_100.png",
          "name": "阿斯頓·馬丁"
        }
      ],
      "title": "A"
    },
    {
      "cars": [
        {
          "icon": "m_172_100.png",
          "name": "巴博斯"
        },
        {
          "icon": "m_157_100.png",
          "name": "寶駿"
        },
        {
          "icon": "m_3_100.png",
          "name": "寶馬"
        },
        {
          "icon": "m_82_100.png",
          "name": "保時捷"
        },
        {
          "icon": "m_163_100.png",
          "name": "北京汽車"
        },
        {
          "icon": "m_211_100.png",
          "name": "北汽幻速"
        },
        {
          "icon": "m_168_100.png",
          "name": "北汽威旺"
        },
        {
          "icon": "m_14_100.png",
          "name": "北汽制造"
        },
        {
          "icon": "m_2_100.png",
          "name": "奔馳"
        },
        {
          "icon": "m_59_100.png",
          "name": "奔騰"
        },
        {
          "icon": "m_26_100.png",
          "name": "本田"
        },
        {
          "icon": "m_5_100.png",
          "name": "標致"
        },
        {
          "icon": "m_127_100.png",
          "name": "別克"
        },
        {
          "icon": "m_85_100.png",
          "name": "賓利"
        },
        {
          "icon": "m_15_100.png",
          "name": "比亞迪"
        },
        {
          "icon": "m_135_100.png",
          "name": "布加迪"
        }
      ],
      "title": "B"
    },
    {
      "cars": [
        {
          "icon": "m_129_100.png",
          "name": "昌河"
        }
      ],
      "title": "C"
    },
    {
      "cars": [
        {
          "icon": "m_113_100.png",
          "name": "道奇"
        },
        {
          "icon": "m_165_100.png",
          "name": "大通"
        },
        {
          "icon": "m_8_100.png",
          "name": "大眾"
        },
        {
          "icon": "m_27_100.png",
          "name": "東風"
        },
        {
          "icon": "m_197_100.png",
          "name": "東風風度"
        },
        {
          "icon": "m_141_100.png",
          "name": "東風風神"
        },
        {
          "icon": "m_115_100.png",
          "name": "東風風行"
        },
        {
          "icon": "m_205_100.png",
          "name": "東風小康"
        },
        {
          "icon": "m_29_100.png",
          "name": "東南"
        },
        {
          "icon": "m_179_100.png",
          "name": "DS"
        }
      ],
      "title": "D"
    },
    {
      "cars": [
        {
          "icon": "m_91_100.png",
          "name": "法拉利"
        },
        {
          "icon": "m_199_100.png",
          "name": "飛馳商務車"
        },
        {
          "icon": "m_164_100.png",
          "name": "菲斯克"
        },
        {
          "icon": "m_40_100.png",
          "name": "菲亞特"
        },
        {
          "icon": "m_7_100.png",
          "name": "豐田"
        },
        {
          "icon": "m_67_100.png",
          "name": "福迪"
        },
        {
          "icon": "m_190_100.png",
          "name": "弗那薩利"
        },
        {
          "icon": "m_208_100.png",
          "name": "福汽啟騰"
        },
        {
          "icon": "m_17_100.png",
          "name": "福特"
        },
        {
          "icon": "m_128_100.png",
          "name": "福田"
        }
      ],
      "title": "F"
    },
    {
      "cars": [
        {
          "icon": "m_109_100.png",
          "name": "GMC"
        },
        {
          "icon": "m_110_100.png",
          "name": "光岡"
        },
        {
          "icon": "m_147_100.png",
          "name": "廣汽"
        },
        {
          "icon": "m_63_100.png",
          "name": "廣汽吉奧"
        },
        {
          "icon": "m_133_100.png",
          "name": "廣汽日野"
        },
        {
          "icon": "m_182_100.png",
          "name": "觀致汽車"
        }
      ],
      "title": "G"
    },
    {
      "cars": [
        {
          "icon": "m_31_100.png",
          "name": "哈飛"
        },
        {
          "icon": "m_196_100.png",
          "name": "哈弗"
        },
        {
          "icon": "m_170_100.png",
          "name": "海格"
        },
        {
          "icon": "m_32_100.png",
          "name": "海馬"
        },
        {
          "icon": "m_149_100.png",
          "name": "海馬商用車"
        },
        {
          "icon": "m_181_100.png",
          "name": "恆天汽車"
        },
        {
          "icon": "m_58_100.png",
          "name": "紅旗"
        },
        {
          "icon": "m_52_100.png",
          "name": "黃海"
        },
        {
          "icon": "m_112_100.png",
          "name": "華泰"
        },
        {
          "icon": "m_45_100.png",
          "name": "匯眾"
        }
      ],
      "title": "H"
    },
    {
      "cars": [
        {
          "icon": "m_35_100.png",
          "name": "江淮"
        },
        {
          "icon": "m_37_100.png",
          "name": "江鈴"
        },
        {
          "icon": "m_38_100.png",
          "name": "江南"
        },
        {
          "icon": "m_98_100.png",
          "name": "捷豹"
        },
        {
          "icon": "m_143_100.png",
          "name": "吉利帝豪"
        },
        {
          "icon": "m_144_100.png",
          "name": "吉利全球鷹"
        },
        {
          "icon": "m_148_100.png",
          "name": "吉利英倫"
        },
        {
          "icon": "m_39_100.png",
          "name": "金杯"
        },
        {
          "icon": "m_57_100.png",
          "name": "金龍聯合"
        },
        {
          "icon": "m_161_100.png",
          "name": "金旅客車"
        },
        {
          "icon": "m_152_100.png",
          "name": "九龍"
        },
        {
          "icon": "m_4_100.png",
          "name": "Jeep"
        }
      ],
      "title": "J"
    },
    {
      "cars": [
        {
          "icon": "m_188_100.png",
          "name": "卡爾森"
        },
        {
          "icon": "m_107_100.png",
          "name": "凱迪拉克"
        },
        {
          "icon": "m_150_100.png",
          "name": "開瑞"
        },
        {
          "icon": "m_51_100.png",
          "name": "克萊斯勒"
        },
        {
          "icon": "m_145_100.png",
          "name": "科尼塞克"
        },
        {
          "icon": "m_212_100.png",
          "name": "KTM"
        }
      ],
      "title": "K"
    },
    {
      "cars": [
        {
          "icon": "m_86_100.png",
          "name": "蘭博基尼"
        },
        {
          "icon": "m_200_100.png",
          "name": "藍海房車"
        },
        {
          "icon": "m_80_100.png",
          "name": "勞斯萊斯"
        },
        {
          "icon": "m_94_100.png",
          "name": "雷克薩斯"
        },
        {
          "icon": "m_99_100.png",
          "name": "雷諾"
        },
        {
          "icon": "m_146_100.png",
          "name": "蓮花"
        },
        {
          "icon": "m_153_100.png",
          "name": "獵豹汽車"
        },
        {
          "icon": "m_76_100.png",
          "name": "力帆"
        },
        {
          "icon": "m_16_100.png",
          "name": "鈴木"
        },
        {
          "icon": "m_166_100.png",
          "name": "理念"
        },
        {
          "icon": "m_95_100.png",
          "name": "林肯"
        },
        {
          "icon": "m_36_100.png",
          "name": "陸風"
        },
        {
          "icon": "m_96_100.png",
          "name": "路虎"
        },
        {
          "icon": "m_83_100.png",
          "name": "路特斯"
        }
      ],
      "title": "L"
    },
    {
      "cars": [
        {
          "icon": "m_183_100.png",
          "name": "邁凱倫"
        },
        {
          "icon": "m_93_100.png",
          "name": "瑪莎拉蒂"
        },
        {
          "icon": "m_18_100.png",
          "name": "馬自達"
        },
        {
          "icon": "m_79_100.png",
          "name": "MG"
        },
        {
          "icon": "m_81_100.png",
          "name": "MINI"
        },
        {
          "icon": "m_201_100.png",
          "name": "摩根"
        }
      ],
      "title": "M"
    },
    {
      "cars": [
        {
          "icon": "m_155_100.png",
          "name": "納智捷"
        }
      ],
      "title": "N"
    },
    {
      "cars": [
        {
          "icon": "m_104_100.png",
          "name": "歐寶"
        },
        {
          "icon": "m_84_100.png",
          "name": "謳歌"
        },
        {
          "icon": "m_171_100.png",
          "name": "歐朗"
        }
      ],
      "title": "O"
    },
    {
      "cars": [
        {
          "icon": "m_156_100.png",
          "name": "啟辰"
        },
        {
          "icon": "m_43_100.png",
          "name": "慶鈴"
        },
        {
          "icon": "m_42_100.png",
          "name": "奇瑞"
        },
        {
          "icon": "m_28_100.png",
          "name": "起亞"
        }
      ],
      "title": "Q"
    },
    {
      "cars": [
        {
          "icon": "m_30_100.png",
          "name": "日產"
        },
        {
          "icon": "m_78_100.png",
          "name": "榮威"
        },
        {
          "icon": "m_142_100.png",
          "name": "瑞麒"
        }
      ],
      "title": "R"
    },
    {
      "cars": [
        {
          "icon": "m_25_100.png",
          "name": "三菱"
        },
        {
          "icon": "m_209_100.png",
          "name": "山姆"
        },
        {
          "icon": "m_195_100.png",
          "name": "紳寶"
        },
        {
          "icon": "m_50_100.png",
          "name": "雙環"
        },
        {
          "icon": "m_102_100.png",
          "name": "雙龍"
        },
        {
          "icon": "m_111_100.png",
          "name": "斯巴魯"
        },
        {
          "icon": "m_10_100.png",
          "name": "斯柯達"
        },
        {
          "icon": "m_89_100.png",
          "name": "smart"
        }
      ],
      "title": "S"
    },
    {
      "cars": [
        {
          "icon": "m_202_100.png",
          "name": "泰卡特"
        },
        {
          "icon": "m_189_100.png",
          "name": "特斯拉"
        }
      ],
      "title": "T"
    },
    {
      "cars": [
        {
          "icon": "m_140_100.png",
          "name": "威麟"
        },
        {
          "icon": "m_186_100.png",
          "name": "威茲曼"
        },
        {
          "icon": "m_19_100.png",
          "name": "沃爾沃"
        },
        {
          "icon": "m_48_100.png",
          "name": "五菱"
        }
      ],
      "title": "W"
    },
    {
      "cars": [
        {
          "icon": "m_13_100.png",
          "name": "現代"
        },
        {
          "icon": "m_174_100.png",
          "name": "星客特"
        },
        {
          "icon": "m_71_100.png",
          "name": "新凱"
        },
        {
          "icon": "m_87_100.png",
          "name": "西雅特"
        },
        {
          "icon": "m_49_100.png",
          "name": "雪佛蘭"
        },
        {
          "icon": "m_6_100.png",
          "name": "雪鐵龍"
        }
      ],
      "title": "X"
    },
    {
      "cars": [
        {
          "icon": "m_194_100.png",
          "name": "揚州亞星客車"
        },
        {
          "icon": "m_138_100.png",
          "name": "野馬汽車"
        },
        {
          "icon": "m_100_100.png",
          "name": "英菲尼迪"
        },
        {
          "icon": "m_53_100.png",
          "name": "一汽"
        },
        {
          "icon": "m_41_100.png",
          "name": "依維柯"
        },
        {
          "icon": "m_75_100.png",
          "name": "永源"
        }
      ],
      "title": "Y"
    },
    {
      "cars": [
        {
          "icon": "m_136_100.png",
          "name": "長安轎車"
        },
        {
          "icon": "m_159_100.png",
          "name": "長安商用"
        },
        {
          "icon": "m_21_100.png",
          "name": "長城"
        },
        {
          "icon": "m_203_100.png",
          "name": "之諾"
        },
        {
          "icon": "m_60_100.png",
          "name": "中華"
        },
        {
          "icon": "m_167_100.png",
          "name": "中歐"
        },
        {
          "icon": "m_77_100.png",
          "name": "眾泰"
        },
        {
          "icon": "m_204_100.png",
          "name": "中通客車"
        },
        {
          "icon": "m_33_100.png",
          "name": "中興"
        }
      ],
      "title": "Z"
    }
  ]
}

  效果如下:

 

  完整源碼下載:https://github.com/pheromone/React-Native-1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM