我有同样的问题,我写了一个解决这个问题的组件,你可以在这里找到它: https://github.com/pavlelekic/react-native-gridview
此外,该组件所做的另一件事是它确保项目宽度是一个整数,因此项目的边框没有抗锯齿,它们清晰明快。
关注Colin Ramsay的回答。如果你想要每个项目的半宽,试试这种方式。
... import { Dimensions } from 'react-native'; const { width, height } = Dimensions.get('window'); const gutter = 0; // You can add gutter if you want ... const styles = StyleSheet.create({ item: { width: (width - gutter * 3)/2, marginBottom: gutter, flexDirection: 'column', alignSelf: 'flex-start', backgroundColor: '#ff0000', }, list: { flexDirection: 'row', justifyContent: 'space-between', flexWrap: 'wrap', paddingHorizontal: gutter, }, });
你需要结合使用 Flexbox的 ,以及ListView包装ScrollView的知识,因此具有其属性。考虑到这一点,您可以使用ScrollView contentContainerStyle 支撑物品的样式。
contentContainerStyle
var TestCmp = React.createClass({ getInitialState: function() { var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); var data = Array.apply(null, {length: 20}).map(Number.call, Number); return { dataSource: ds.cloneWithRows(data), }; }, render: function() { return ( <ListView contentContainerStyle={styles.list} dataSource={this.state.dataSource} renderRow={(rowData) => <Text style={styles.item}>{rowData}</Text>} /> ); } });
只是一个带有一些虚拟数据的ListView。注意使用 contentContainerStyle 。这是样式对象:
var styles = StyleSheet.create({ list: { flexDirection: 'row', flexWrap: 'wrap' }, item: { backgroundColor: 'red', margin: 3, width: 100 } });
我们告诉容器我们想要包装行中的项目,我们设置每个子对象的宽度。
使用检查以下示例 的 FlatList 强> 的组成部分 的 反应原生 强> 支持无限滚动,具有出色的性能:
//Resize the grid onLayout = (event) => { const {width} = event.nativeEvent.layout; const itemWidth = 150 const numColumns = Math.floor(width/itemWidth) this.setState({ numColumns: numColumns }) } render() { return ( <Content contentContainerStyle={{flex:1, alignItems: 'center'}} onLayout={this.onLayout}> <FlatList data={this.state.products} keyExtractor={(item, index) => index} key={this.state.numColumns} numColumns={this.state.numColumns} renderItem={({item}) => <ListThumb //Custom component, it's only an example. navigation={navigation} brand={item.brand} price={item.price} imageSource={item.image_link}/> } /> </Content> ) }
这个例子看起来像
最好的问候,Nicholls
我添加这个作为答案,因为溢出的评论隐藏在Colin Ramsay的回复中:从React Native 0.28开始,你还需要 alignItems: 'flex-start', 在listview样式或flexWrap将无法正常工作。感谢codump.io上的Kerumen。所以,
alignItems: 'flex-start',
var styles = StyleSheet.create({ list: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'flex-start', },
......其余的和科林的回答一样。
ListView现在 弃用 你应该使用 FlatList 代替。 FlatList有一个名为的道具 numColumns 这正是我们想要创建可滚动网格的原因。
numColumns
例如:
const data = [ {id: 'a', value: 'A'}, {id: 'b', value: 'B'}, {id: 'c', value: 'C'}, {id: 'd', value: 'D'}, {id: 'e', value: 'E'}, {id: 'f', value: 'F'}, ]; const numColumns = 3; const size = Dimensions.get('window').width/numColumns; const styles = StyleSheet.create({ itemContainer: { width: size, height: size, }, item: { flex: 1, margin: 3, backgroundColor: 'lightblue', } }); function Grid(props) { return ( <FlatList data={data} renderItem={({item}) => ( <View style={styles.itemContainer}> <Text style={styles.item}>{item.value}</Text> </View> )} keyExtractor={item => item.id} numColumns={numColumns} /> ); }
这个 博客文章 很好地解释了FlatList的新功能。
注意:出于某种原因,您必须使用 keyExtractor 在FlatList上而不是典型的 key 每个项目的道具。否则你会收到警告。 基本FlatList代码抛出警告 - React Native
keyExtractor
key
在反应原生中使用FlatList而不是Listview。它具有更多的增值功能和更好的性能。 在这里查看示例
您可以使用FlatList并设置numColumns来获取与grid相同的结果