每行显示 2 个项目 [反应原生]

Posted

技术标签:

【中文标题】每行显示 2 个项目 [反应原生]【英文标题】:show 2 items per row[react native] 【发布时间】:2017-03-18 00:41:01 【问题描述】:

我正在学习本机反应,在所有教程中,我看到 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>
    );

【问题讨论】:

当我在 renderDeviceEventList 中为 View 组件提供宽度和高度时,它可以工作但没有响应。我知道有一个 Dimension 库,但我听说它在更改方向时不起作用。 【参考方案1】:

正确的做法是使用flexBasis,将值设置为(1/n)%,其中n 是所需的行数> 0。对于两行:

.parent 
    flex: 1;
    flexWrap: 'wrap';
    flexDirecton: 'row';

.child 
    flexBasis: '50%';

【讨论】:

太棒了!谢谢 - 父 'flexDirecton' 中的小错字,很容易修复,但破坏了复制粘贴性:) 支持和非常感谢。 很好,谢谢(只要确保'wrap'和'row'等值用单引号括起来,否则react native会报错 Flex方向属性有错字,请更新如下:flexDirection【参考方案2】:

您可以从 react native 尝试平面列表。 您可以在其中指定列数,也可以提及垂直方向或水平方向。 示例代码:

<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

【讨论】:

【参考方案3】:

要使用 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',
    ,
);

更改样式以选择您想在屏幕上看到的行数。此代码是响应式的。

【讨论】:

我认为你不需要那个ScrollView。你呢? 尽管这适用于大多数移动设备,但我认为这不是最好的解决方案。因为使用这种方法,您假设屏幕的宽度小于~450。这在此刻可能是正确的,但后来,它可能不是真的。 @nikk-wong 的答案是我猜的正确方法。【参考方案4】:

如果您想让网格视图真正响应设备宽度导入尺寸

import 
  StyleSheet,
  Text,
  ...
  Dimensions,
 from 'react-native';

并为此更改 gridItem 宽度:

gridItem: 
  margin: 5,
  width: Dimensions.get('window').width / 2.2, //Device width divided in almost a half
  height: 150,
  justifyContent: 'center',
  alignItems: 'center',
,

您还可以将图像宽度更改为与 gridItem 相同或更少。

【讨论】:

比设置像 150 这样的任意数字要好得多,因为在具有高 dpis/比率的设备上您不会得到相同的结果。很好的答案!它更好,但您还必须检查像素比率,因为它无法在 android 上正确缩放。【参考方案5】:

您可以使用 FlatList 并为其设置 numColumns=2 属性和 style= flexDirection: 'column' 。 就我而言,我正在使用 3 个 cols: FlatList with numColumns=3

【讨论】:

【参考方案6】:
flex: 1,
flexDirection: 'row',
justifyContent: 'space-between'

试着放这个!

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于每行显示 2 个项目 [反应原生]的主要内容,如果未能解决你的问题,请参考以下文章

反应原生 - 有办法隐藏/显示另一个页面中的项目?

在我的反应原生项目中使用 axios 显示对象给出未定义

反应原生模态时间延迟和生涩的动画

父平面列表项之间的反应原生显示平面列表组件

在 UICollectionView 中每行显示 3 个项目

我们如何在反应原生项目中将多个图像合并为单个图像