React具有多行的Native水平FlatList

时间:2017-08-29 12:58:16

标签: react-native

我试图实现一个有两行的水平滚动列表。使用FlatList,垂直滚动列表涉及设置numColumns,但没有使用水平行的等效项。

我成功地使它能够正确渲染,并且它完美无缺。但是,会发出警告,指出flexWrapVirtualizedList不支持设置FlatList,并使用numColumns。我不能使用numColumns,因为它不适用于水平列表。

<FlatList
    horizontal={true}
    contentContainerStyle={{
        flexDirection: 'column',
        flexWrap: 'wrap'
    }}
    {...otherProps}
/>

我发现了添加此警告的提交,但无法找到其背后的原因。似乎没有办法在没有警告被抛出的情况下完成这项工作,至少在没有完全放弃FlatList的情况下。对于包含行的水平列表,是否有更合适的解决方案?

参考文献:

4 个答案:

答案 0 :(得分:2)

在这种情况下,请不要使用horizontal={true} 您应该使用numColumns等长数据/ 2 并将其放在<ScrollView>标签上

<ScrollView>
    <FlatList
    contentContainerStyle={{
        alignSelf: 'flex-start'
    }}
    numColumns={listData.length / 2}
    showsVerticalScrollIndicator={false}
    showsHorizontalScrollIndicator={false}
    data={listData}
    renderItem={({ item, index }) => {
        //push your code
    })
    />
<ScrollView>

答案 1 :(得分:1)

我遇到了一个问题列表(几百个),问题不那么长,我通过遍历列表将它们映射到多个视图(每个视图一个接一个,另一个接一个)来克服了这个问题。使用flex)

如果您的列表不太长,您也可以使用# EXECUTIVE SUMMARY Lorem ipsum dolor sit amet, consectetur adipiscing elit. ... ... # TECHNICAL REVIEW Lorem ipsum dolor sit amet, consectetur adipiscing elit. ... ... ## BIOMEDICAL NATURAL LANGUAGE PROCESSING Lorem ipsum dolor sit amet, consectetur adipiscing elit. ... ... # PROPOSED WORK Lorem ipsum dolor sit amet, consectetur adipiscing elit. ... 并且它支持ScrollView

答案 2 :(得分:1)

我用简单的逻辑看

<ScrollView
    horizontal
    showsHorizontalScrollIndicator={false}
    contentContainerStyle={{
        justifyContent: 'center',
        paddingHorizontal: 20,
        paddingBottom: 70,
    }}>
    <View>
        <View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>
            {this.state.interest.length
                ? this.state.interest.map((d, i) => {
                    if (i % 2 == 0) {
                        return null;
                    }
                    return (
                        <Intrest
                            style={{
                                height: 40,
                                paddingHorizontal: 20,
                                alignItems: 'center',
                                justifyContent: 'center',
                                borderRadius: 30,
                                margin: 2.5,
                            }}
                            key={i}
                            data={d}
                            add={data => {
                                this._handleAddtoSelection(data);
                            }}
                            remove={data => {
                                this._handleRemoveFromSelection(data);
                            }}
                            active={this._isSelectedTopic(d)}
                        />
                    );
                })
                : null}
        </View>
        <View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>
            {this.state.interest.length
                ? this.state.interest.map((d, i) => {
                    if (i % 2 != 0) {
                        return null;
                    }
                    return (
                        <Intrest
                            style={{
                                height: 40,
                                paddingHorizontal: 20,
                                alignItems: 'center',
                                justifyContent: 'center',
                                borderRadius: 30,
                                margin: 2.5,
                            }}
                            key={i}
                            data={d}
                            add={data => {
                                this._handleAddtoSelection(data);
                            }}
                            remove={data => {
                                this._handleRemoveFromSelection(data);
                            }}
                            active={this._isSelectedTopic(d)}
                        />
                    );
                })
                : null}
        </View>
    </View>
</ScrollView>

输出:Output

答案 3 :(得分:0)

增强第一个答案,这就是我所做的:

const listData = props.data ?? [];
const numColumns = Math.ceil(listData.length / 2);
        <ScrollView
          horizontal
          showsVerticalScrollIndicator={false}
          showsHorizontalScrollIndicator={false}
          contentContainerStyle={{ paddingVertical: 20 }}>
          <FlatList
            scrollEnabled={false}
            contentContainerStyle={{
              alignSelf: 'flex-start',
            }}
            numColumns={numColumns}
            showsVerticalScrollIndicator={false}
            showsHorizontalScrollIndicator={false}
            data={listData}
            renderItem={renderItem}
          />
        </ScrollView>