本篇文章主要介紹了React Native之ListView實現九宮格效果的範例,具有一定的參考價值,有興趣的小夥伴們可以參考一下
##概述
##dataSource:數據來源,類似安卓中我們傳入BaseAdapter的資料集合。
renderRow:渲染某一行,類似BaseAdapter中的getItem方法。
onEndReached:簡單說就是用於分頁操作,在安卓中原生開發中,我們需要自己實作對應的方法。
onEndReachedThreshold:呼叫onEndReached之前的臨界值,單位是像素。
refreshControl:指定RefreshControl元件,用於為ScrollView提供下拉式刷新功能。 (該屬性是繼承與ScrollView)
renderHeader:渲染頭部View,類似安卓ListView中的addHeader.
以上的屬性基本上可以解決一些常見的清單需求,如果我們想要實現網格的效果,也可以藉助該元件來實現,有點類似安卓中的RecyclerView控制項。
pageSize:渲染的網格數,類似安卓GridView中的numColumns.
contentContainerStyle:此屬性是繼承於ScrollView,主要作用於該元件的內容容器上。
要用ListView實作九宮格的效果:
1,設定pageSize確認網格數量
<ListView automaticallyAdjustContentInsets={false} contentContainerStyle={styles.grid} dataSource={this.state.dataSource} renderRow={this.renderRow.bind(this)} pageSize={3} refreshControl={ <RefreshControl onRefresh={this.onRefresh.bind(this)} refreshing={this.state.isLoading} colors={['#ff0000', '#00ff00', '#0000ff']} enabled={true} /> } />
2,設定每個網格的寬度樣式
itemLayout:{ flex:1, width:Util.size.width/3, height:Util.size.width/3, alignItems:'center', justifyContent:'center', borderWidth: Util.pixel, borderColor: '#eaeaea' },
3,設定contentContainerStyle對應屬性
grid: { justifyContent: 'space-around', flexDirection: 'row', flexWrap: 'wrap' },
這裡要說明下,由於ListView的預設方向是縱向的,所以需要設定ListView的contentContainerStyle屬性,加入flexDirection:'row'。其次,ListView在同一行顯示,而且透過flexWrap:'wrap'設定自動換行。
註:flexWrap屬性:wrap、nowrap,wrap:空間不足的情況下自動換行,nowrap:空間不足,壓縮容器,不會自動換行。
以下是完整程式碼:
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, ListView, Image, TouchableOpacity, // 不透明触摸 AlertIOS } from 'react-native'; // 获取屏幕宽度 var Dimensions = require('Dimensions'); const screenW = Dimensions.get('window').width; // 导入json数据 var shareData = require('./shareData.json'); // 一些常亮设置 const cols = 3; const cellWH = 100; const vMargin = (screenW - cellWH * cols) / (cols + 1); const hMargin = 25; // ES5 var ListViewDemo = React.createClass({ // 初始化状态值(可以变化) 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.8} onPress={()=>{AlertIOS.alert('点击了')}} > <View style={styles.innerViewStyle}> <Image source={{uri:rowData.icon}} style={styles.iconStyle} /> <Text>{rowData.title}</Text> </View> </TouchableOpacity> ); }, }); const styles = StyleSheet.create({ listViewStyle:{ // 主轴方向 flexDirection:'row', // 一行显示不下,换一行 flexWrap:'wrap', // 侧轴方向 alignItems:'center', // 必须设置,否则换行不起作用 }, innerViewStyle:{ width:cellWH, height:cellWH, marginLeft:vMargin, marginTop:hMargin, // 文字内容居中对齐 alignItems:'center' }, iconStyle:{ width:80, height:80, }, }); AppRegistry.registerComponent('ListViewDemo', () => ListViewDemo);
效果如圖(資料來源本身加)
#
以上是ListView實作九宮格效果案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!