我正在学习本机反应,在所有教程中,我看到ListView每行只使用1个项目。不过我还没有使用过ListView。我只有6个项目必须显示为平面网格,每行2个项目,应该是响应。我知道这是一个基本的问题,但我也尝试过,我可以在图像中看到
这是我的代码
renderDeviceEventList() {
return _.map(this.props.deviceEventOptions, deviceEventOption => (
<View key={deviceEventOption.id}>
<Icon
name={deviceEventOption.icon_name}
color="#ddd"
size={30}
onPress={() =>
this.props.selectDeviceEvent(deviceEventOption)
}
/>
<Text style={{ color: "#ff4c4c" }}>
{deviceEventOption.icon_name}
</Text>
</View>
));
}
render() {
return (
<View
style={{
flex: 1,
top: 60,
flexDirection: "row",
justifyContent: "space-around",
flexWrap: "wrap",
marginBottom: 10
}}
>
{this.renderDeviceEventList()}
</View>
);
}
答案 0 :(得分:12)
您可以尝试使用本机的平面列表。 在哪里可以指定列数,也可以提到垂直方向或水平方向。 示例代码:
<FlatList
data={this.props.data}
keyExtractor={this._keyExtractor} //has to be unique
renderItem={this._renderItem} //method to render the data in the way you want using styling u need
horizontal={false}
numColumns={2}
/>
请参阅https://facebook.github.io/react-native/docs/flatlist.html了解更多信息。
答案 1 :(得分:10)
要使用ListView
制作2行网格,您可以使用此代码作为示例:
renderGridItem( item ){
return (<TouchableOpacity style={styles.gridItem}>
<View style={[styles.gridItemImage, justifyContent:'center', alignItems:'center'}]}>
<Text style={{fontSize:25, color:'white'}}>
{item.fields.name.charAt(0).toUpperCase()}
</Text>
</View>
<Text style={styles.gridItemText}>{item.fields.name}</Text>
</TouchableOpacity>
);
}
renderCategories(){
var listItems = this.dsinit.cloneWithRows(this.state.dataSource);
return (
<ScrollView style={{backgroundColor: '#E8E8E8', flex: 1}} >
<ListView
contentContainerStyle={styles.grid}
dataSource={listItems}
renderRow={(item) => this.renderGridItem(item)}
/>
</ScrollView>
);
}
const styles = StyleSheet.create({
grid: {
justifyContent: 'center',
flexDirection: 'row',
flexWrap: 'wrap',
flex: 1,
},
gridItem: {
margin:5,
width: 150,
height: 150,
justifyContent: 'center',
alignItems: 'center',
},
gridItemImage: {
width: 100,
height: 100,
borderWidth: 1.5,
borderColor: 'white',
borderRadius: 50,
},
gridItemText: {
marginTop: 5,
textAlign:'center',
},
});
更改样式以选择要在屏幕上显示的行数。此代码具有响应性。
答案 2 :(得分:9)
正确的方法是使用flexBasis
,其值设置为(1/n)%
,其中n
是所需的行数&gt; 0.对于两行:
.parent {
flex: 1;
flexWrap: wrap;
flexDirecton: row;
}
.child {
flexBasis: '50%';
}
答案 3 :(得分:6)
如果您想让网格视图快速响应设备宽度导入 Dimesions :
$ ./open
The process was succeeded
$ ls -lh
-rwxrwxr-x 1 hemre hemre 8.5K Feb 1 23:38 open
--wS-wx--T 1 hemre hemre 0 Feb 1 23:39 foo.txt
并为此更改 gridItem 宽度:
import {
StyleSheet,
Text,
...
Dimensions,
} from 'react-native';
此外,您可以将图像宽度更改为与 gridItem 相同或更低。
答案 4 :(得分:5)
您可以使用FlatList并将numColumns={2}
道具和style={{ flexDirection: 'column' }}
设置为它。
在我的情况下,我正在使用3个cols:
FlatList with numColumns={3}