React Native中的分区ListView

/ 0评 / 0

什么是分区ListView?做iOS开发的都知道tableView是有分区表一说的,其实在这里是一样的,ReactNative中也是有分区的ListView的,跟之前的ListView其实差不多,只是要注意dataBlob也就是数据的组合,要按照一定的结构去组合,还有就是区头的设置,来看一下代码的实现

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

//导入json数据
var car = require('./Car.json');

var Dimensions = require('Dimensions');
var {width} = Dimensions.get('window');

var listTable = React.createClass({//类名一定要大写开头
    //初始化函数
    getInitialState(){
        var getSectionData = (dataBlob, sectionID) => {
            return dataBlob[sectionID];
        };

        var getRowData = (dataBlob, sectionID, rowID) => {
            return dataBlob[sectionID + ':' + rowID];
        };

        return{
            dataSource: new ListView.DataSource({
                getSectionData:getSectionData, //获取组中的数据
                getRowData:getRowData, //获取行中的数据
                rowHasChanged: (r1, r2) => r1 !== r2,
                sectionHeaderHasChanged: (s1, s2) => s1 !== s2,
            })
        }
    },

    //做一些复杂的操作:数据请求 或者 异步操作(定时器)
    componentDidMount(){
        //调用json数据
        this.loadDataFromJson();
    },

    loadDataFromJson(){
        //拿到json数据
        var jsonData = car.data;

        //定义一些变量
        var dataBlob = {},
            sectionIDs = [],
            rowIDs = [],
            cars = [];

        //遍历
        for (var i = 0; i < jsonData.length; i++) {
            //1.把组号放入sectionIDs数组中
            sectionIDs.push(i);

            //2.把组中内容放入dataBlob对象中
            dataBlob[i] = jsonData[i].title;

            //3.取出该组中所有的车
            cars = jsonData[i].cars;
            rowIDs[i] = [];

            //4.遍历所有的车数组
            for (var j = 0; j < cars.length; j++) {
                //把行号放入rowIDs中
                rowIDs[i].push(j);
                //把每一行中的内容放入dataBlob中
                dataBlob[i + ':' + j] = cars[j];
            }
        }
        //更新状态
        this.setState({
            dataSource: this.state.dataSource.cloneWithRowsAndSections(dataBlob,sectionIDs,rowIDs)
        });
    },
    

    render(){
        return(
            
                {/*头部*/}
                
                    SeeMyGo品牌
                
                {/*ListView*/}
                
            
        );
    },
    
    //每一行的数据
    renderRow(rowData){
        return(
            {AlertIOS.alert(rowData.name)}}>
                
                    
                    { rowData.name }
                
            
        );
    },

    // 每一组中的数据
    renderSectionHeader(sectionData, sectionID){
        return(
            
                {sectionData}
            
        );
    }
});


const styles = StyleSheet.create({
    outerViewStyle:{
        //占满屏幕
        flex:1,
    },
    headerViewStyle:{
        height:64,
        backgroundColor:'orange',

        justifyContent:'center',
        alignItems:'center'
    },
    rowStyle:{
        //设置主轴方向
        flexDirection:'row',
        alignItems:'center',
        padding:10,
        borderBottomColor:'#e8e8e8',
        borderBottomWidth:0.5
    },
    rowImageStyle:{
        width:70,
        height:70,
    },
    sectionHeaderViewStyle:{
        backgroundColor:'#e8e8e8',
        height:25,

        justifyContent:'center',
    }
});

//输出类
module.exports = listTable;

只需要看好数据的组成结构就行,还有就是写代码的时候要专心,我这里面写的时候就是分心写错了几个字母就报错了
来看一下运行结果

评论已关闭。