每行显示2个项目[本机反应]

时间:2016-11-04 08:38:14

标签: javascript reactjs react-native flexbox

我正在学习本机反应,在所有教程中,我看到ListView每行只使用1个项目。不过我还没有使用过ListView。我只有6个项目必须显示为平面网格,每行2个项目,应该是响应。我知道这是一个基本的问题,但我也尝试过,我可以在图像中看到

enter image description here

这是我的代码

 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>
    );
}

5 个答案:

答案 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}