zoukankan      html  css  js  c++  java
  • ListView 九宫格布局实现

    1.效果图

    2.数据

    SettingData.json

    {
        "data": [{
            "icon":"setting",
            "title":"设置"
        },{
            "icon":"setting",
            "title":"设置"
        },{
            "icon":"setting",
            "title":"设置"
        },{
            "icon":"setting",
            "title":"设置"
        },{
            "icon":"setting",
            "title":"设置"
        },{
            "icon":"setting",
            "title":"设置"
        }]
    }
    

      

    3.组件代码

    /**
     * 设置
     * 九宫格布局
     */
    import React, { Component } from 'react';
    import {
        StyleSheet,
        Text,
        View,
        Image,
        ListView,
        Dimensions,
        TouchableOpacity,
        ToastAndroid,
        BackAndroid,
        AsyncStorage,
    } from 'react-native';
    
    import PropTypes from 'prop-types';
    
    // 获取屏幕宽高
    const {width, height} = Dimensions.get('window');
    
    // 引入 自定义导航栏组件
    import CommunalNavBar from '../../components/CommunalNavBar';
    // 引入 菜单数据
    import SettingData from './SettingData.json';
    
    import Prompt from 'react-native-prompt';
    
    //常量设置
    let cols = 3;
    let cellWH = 100;
    let vMargin = (width-cellWH*cols)/(cols+1);
    let hMargin = 20;
     
    export default class Setting extends Component {
    
        constructor(props){
            super(props);
            //1.设置数据源
            let ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
            //2.设置返回数据
            this.state = {
                dataSource:ds.cloneWithRows(SettingData.data),
                isShow:false,
                message:'',
            };
            that = this;
        }
    
        // 返回中间按钮
        renderTitleItem() {
            return(
                <Text style={styles.navbarTitleItemStyle}>设置</Text>
            );
        }
    
    
        render(){
            return(
                <View style={styles.container}>
                    {/* 导航栏样式 */}
                    <CommunalNavBar
                        titleItem = {() => this.renderTitleItem()}
                    />
    
                    {/* 九宫格 */}
                    <ListView
                        dataSource={this.state.dataSource}
                        renderRow={this._renderRow}
                        contentContainerStyle={styles.listViewStyle}
                    />
    
                    <Prompt  
                        visible={this.state.isShow}  
                        title={'提示:'}  
                        placeholder={'请输入IP地址!'}  
                        onCancel ={  
                            () => {  
                                  this.setState({  
                                    isShow:false  
                                });  
                            }  
                        }  
                        onSubmit={  
                            (new_value) => {  
                                this.setState({  
                                    isShow:false,  
                                    message:new_value  
                                });
                                if(!new_value){
                                    new_value = 'http://14.127.188.40:8848';
                                }
    
                                // 保存 IP
                                AsyncStorage.setItem('LoginIP',new_value);
    
                                ToastAndroid.show('保存成功,请重新登录!',ToastAndroid.SHORT);
                                // 关闭程序
                                BackAndroid.exitApp();
                            }  
                        }  
                        cancelText={'取消'}  
                        submitText={'提交'}
                    />
                </View>
            );
        }
    
        _renderRow(rowData, sectionID, rowID, highlightRow){
            return(
                <TouchableOpacity activeOpacity={0.5} onPress={()=>{that._onPress(rowData.title)}}>
                    <View style={styles.innerViewStyle}>
                        <Image source={{uri:rowData.icon}} style={styles.iconStyle}/>
                        <Text style={styles.txtStyle}>{rowData.title}</Text>
                    </View>
                </TouchableOpacity>
            );
        }
    
        _onPress(e) {
            this.setState({
                isShow:true
            });
        }  
    
    }
     
    const styles = StyleSheet.create({
        container: {
            flex:1,
            backgroundColor:'#fff',
        },
        navbarTitleItemStyle: {
            fontSize:17,
            color:'#fff',
        },
    
        listViewStyle:{
            flexDirection:'row',
            flexWrap:'wrap',
        },
        iconStyle:{
            30,
            height:30,
            marginBottom:10,
        },
        txtStyle:{
            color:'#1296DB',
        },
    
        innerViewStyle:{
            cellWH,
            height:cellWH,
            marginLeft:vMargin,
            marginTop:hMargin,
            alignItems:'center',
        }
    });
    

    .

  • 相关阅读:
    leetcode——91.解码方法
    leetcode——64.最小路径和
    Layui上传图片2.0版
    LINQ中判断日期时间段
    Http基础
    Js中数组,字符串的常用方法
    C#数组,ArrayList,List区别
    08-01 通过线性回归了解算法流程
    08-00 课程习得
    C-02 推荐系统
  • 原文地址:https://www.cnblogs.com/crazycode2/p/7482366.html
Copyright © 2011-2022 走看看