ReactNative 中 ListView實現GridView效果
阿新 • • 發佈:2019-01-30
在RN中ListVIew擁有ScrollView的所有屬性,所以可以吧ListView當成是ScrollView的一種延伸,在RN中雖然不存在父子類,不過我覺的可以把 ListView當成ScrollView的子類來看。
所以改變ListView的排列方式其實就是改變lIstView的主軸的方向。
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, {Component} from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
ListView,
Image,
TouchableOpacity,
AlertIOS
} from 'react-native' ;
var Dimensions = require('Dimensions');
var {width} = Dimensions.get('window');
var {height} = Dimensions.get('window');
var shareData = require('./shareData.json').data;
var GridView = React.createClass({
getDefaultProps(){
return{
// ..ListView.propTypes
}
},
getInitialState(){
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
return {
dataSource:ds.cloneWithRows(shareData)
}
},
render(){
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this .renderRow}
contentContainerStyle={styles.listStyle}
showsVerticalScrollIndicator={false}
showsHorizontalScrollIndicator={false}
/>
)
},
// 返回Item試圖
renderRow(rowData,sectionId,rowId,hItemId){
return(
<TouchableOpacity
style={styles.itemViewStyle}
onPress={() => {AlertIOS.alert(rowId)}}
>
<View style={styles.itemViewStyle}>
<Image source={{uri:rowData.icon}} style={styles.itemIconStyle}/>
<Text style={styles.itemTitleStyle}>{rowData.title}</Text>
</View>
</TouchableOpacity>
)
}
})
const styles = StyleSheet.create({
listStyle:{
flexDirection:'row', //改變ListView的主軸方向
flexWrap:'wrap', //換行
},
itemViewStyle:{
alignItems:'center', //這裡要注意,如果每個Item都在外層套了一個 Touchable的時候,一定要設定Touchable的寬高
width: width / 3,
height:100
},
itemIconStyle:{
width:60,
height:60
},
itemTitleStyle:{
marginTop:8
}
});
module.exports = GridView;